diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..4746db0 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,26 @@ +module.exports = { + env: { + node: true, + browser: true, + es6: true, + }, + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + ignorePatterns: ['dist/', 'node_modules/', '*.gen.ts'], + plugins: ['@typescript-eslint', 'unused-imports', '@stylistic/ts'], + rules: { + '@typescript-eslint/member-ordering': 'error', + '@typescript-eslint/ban-ts-comment': 'off', // "move fast" mode + '@typescript-eslint/no-explicit-any': 'off', // "move fast" mode + 'linebreak-style': ['error', 'unix'], + 'unused-imports/no-unused-imports': 'error', + // No double quotes + quotes: ['error', 'single', { avoidEscape: true }], + // No extra semicolon + '@stylistic/ts/semi': ['error', 'never'], + }, +} diff --git a/.github/scripts/is_release_for_package.sh b/.github/scripts/is_release_for_package.sh new file mode 100755 index 0000000..c8965ef --- /dev/null +++ b/.github/scripts/is_release_for_package.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +# This script checks if the specified package has changesets in the current commit. + +set -eu + +if [ $# -lt 1 ]; then + echo "Error: Package name is required as the first argument." >&2 + exit 1 +fi + +PACKAGE_NAME=$1 +PACKAGE_CHANGES=$(node -e "require('@changesets/read').default(process.cwd()).then(result => console.log(result.flatMap(changeset => changeset.releases.flatMap(release => release.name)).includes('${PACKAGE_NAME}')))") + +echo "${PACKAGE_CHANGES}" diff --git a/.github/workflows/js-sdk-tests.yml b/.github/workflows/js-sdk-tests.yml new file mode 100644 index 0000000..0cdb38f --- /dev/null +++ b/.github/workflows/js-sdk-tests.yml @@ -0,0 +1,60 @@ +name: Test JS SDK + +on: + workflow_call: + secrets: + E2B_API_KEY: + required: true + description: 'E2B API key for testing' + +jobs: + integration_tests: + runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write + defaults: + run: + working-directory: ./packages/js-sdk + name: Build and test SDK + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install + with: + version: ${{ env.TOOL_VERSION_PNPM }} + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: '${{ env.TOOL_VERSION_NODEJS }}' + registry-url: 'https://registry.npmjs.org' + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Test build + run: pnpm build + + - name: Run Node tests + run: pnpm test + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..c5aace2 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,76 @@ +name: Lint + +on: + pull_request: + +jobs: + lint: + name: Lint + runs-on: ubuntu-latest + + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + + - uses: pnpm/action-setup@v4 + with: + version: ${{ env.TOOL_VERSION_PNPM }} + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '${{ env.TOOL_VERSION_NODEJS }}' + cache: pnpm + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '${{ env.TOOL_VERSION_PYTHON }}' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: ${{ env.TOOL_VERSION_POETRY }} + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install Python dependencies + working-directory: packages/python-sdk + run: | + poetry install --with dev + + - name: Run linting + run: | + pnpm run lint + + - name: Run formatting + run: | + pnpm run format + + - name: Check for uncommitted changes + run: | + if [[ -n $(git status --porcelain) ]]; then + echo "❌ Files are not formatted properly:" + git status --short + git diff + exit 1 + else + echo "✅ No changes detected." + fi diff --git a/.github/workflows/publish_packages.yml b/.github/workflows/publish_packages.yml index d3b46c5..5c7c078 100644 --- a/.github/workflows/publish_packages.yml +++ b/.github/workflows/publish_packages.yml @@ -1,22 +1,21 @@ -name: Test Decktop SDK Packages +name: Test Desktop SDK Packages on: workflow_call: secrets: E2B_API_KEY: required: true - NPM_TOKEN: - required: true PYPI_TOKEN: required: true permissions: + id-token: write contents: write jobs: test: name: Publish Desktop SDK - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/create-github-app-token@v1 id: app-token @@ -29,27 +28,36 @@ jobs: with: token: ${{ steps.app-token.outputs.token }} + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: - python-version: "3.9" + python-version: '${{ env.TOOL_VERSION_PYTHON }}' - name: Install and configure Poetry uses: snok/install-poetry@v1 with: - version: 1.5.1 + version: ${{ env.TOOL_VERSION_POETRY }} virtualenvs-create: true virtualenvs-in-project: true installer-parallel: true - uses: pnpm/action-setup@v3 with: - version: 9.5 + version: ${{ env.TOOL_VERSION_PNPM }} - - name: Setup Node.js 18 - uses: actions/setup-node@v3 + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: '18.x' + node-version: '${{ env.TOOL_VERSION_NODEJS }}' + registry-url: 'https://registry.npmjs.org' cache: pnpm - name: Configure pnpm @@ -57,6 +65,11 @@ jobs: pnpm config set auto-install-peers true pnpm config set exclude-links-from-lockfile true + - name: Update npm + run: | + npm install -g npm@^11.6 + npm --version + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -65,13 +78,6 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Generate SDK reference - id: sdk-ref - run: pnpm run --recursive generate-ref - - - name: Show docs file structure - run: tree ./sdk-reference - - name: Release new versions uses: changesets/action@v1 with: @@ -79,8 +85,8 @@ jobs: createGithubReleases: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + NPM_TOKEN: '' # See https://github.com/changesets/changesets/issues/1152#issuecomment-3190884868 - name: Update lock file run: pnpm i --no-link --no-frozen-lockfile @@ -89,7 +95,6 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git add ./sdk-reference git commit -am "[skip ci] Release new versions" || exit 0 git push env: diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..b968d43 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,24 @@ +name: Pull Request + +permissions: + contents: read + id-token: write + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +on: + pull_request: + branches: + - main + +jobs: + js-sdk: + uses: ./.github/workflows/js-sdk-tests.yml + secrets: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} + python-sdk: + uses: ./.github/workflows/python-sdk-tests.yml + secrets: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} diff --git a/.github/workflows/python-sdk-tests.yml b/.github/workflows/python-sdk-tests.yml new file mode 100644 index 0000000..85f7650 --- /dev/null +++ b/.github/workflows/python-sdk-tests.yml @@ -0,0 +1,54 @@ +name: Test Python SDK + +on: + workflow_call: + secrets: + E2B_API_KEY: + required: true + description: 'E2B API key for testing' + +jobs: + integration_tests: + runs-on: ubuntu-24.04 + permissions: + contents: read + id-token: write + defaults: + run: + working-directory: ./packages/python-sdk + name: Build and test SDK + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '${{ env.TOOL_VERSION_PYTHON }}' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: ${{ env.TOOL_VERSION_POETRY }} + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install dependencies + run: poetry install + + - name: Test build + run: poetry build + + - name: Run tests + run: poetry run pytest --verbose -x + env: + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 00526d3..5ff4bcb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,7 @@ on: concurrency: ${{ github.workflow }}-${{ github.ref }} permissions: + id-token: write contents: write jobs: @@ -20,16 +21,24 @@ jobs: - name: Checkout Repo uses: actions/checkout@v3 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + - name: Install pnpm uses: pnpm/action-setup@v3 id: pnpm-install with: - version: 9.5 + version: ${{ env.TOOL_VERSION_PNPM }} - name: Setup Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: "18.x" + node-version: '${{ env.TOOL_VERSION_NODEJS }}' registry-url: "https://registry.npmjs.org" cache: pnpm cache-dependency-path: pnpm-lock.yaml @@ -54,34 +63,53 @@ jobs: if: needs.is_release.outputs.release == 'true' runs-on: ubuntu-latest outputs: - js-sdk: ${{ steps.filter.outputs.js-sdk }} - python-sdk: ${{ steps.filter.outputs.python-sdk }} + js-sdk: ${{ steps.js.outputs.release }} + python-sdk: ${{ steps.python.outputs.release }} steps: - - name: Checkout repository + - name: Checkout Repo uses: actions/checkout@v3 + + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions with: - fetch-depth: 0 + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' - - name: Get the last release - id: last_release - uses: cardinalby/git-get-release-action@v1 - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Install pnpm + uses: pnpm/action-setup@v3 + id: pnpm-install with: - latest: true - prerelease: false - draft: false + version: ${{ env.TOOL_VERSION_PNPM }} - - name: Find changes since the last release - uses: dorny/paths-filter@v2 - id: filter + - name: Setup Node + uses: actions/setup-node@v6 with: - base: ${{ steps.last_release.outputs.tag_name }} - filters: | - js-sdk: - - 'packages/js-sdk/**' - python-sdk: - - 'packages/python-sdk/**' + node-version: '${{ env.TOOL_VERSION_NODEJS }}' + registry-url: 'https://registry.npmjs.org' + cache: pnpm + cache-dependency-path: pnpm-lock.yaml + + - name: Configure pnpm + run: | + pnpm config set auto-install-peers true + pnpm config set exclude-links-from-lockfile true + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Check JavasScript SDK Release + id: js + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/desktop") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" + + - name: Check Python SDK Release + id: python + run: | + IS_RELEASE=$(./.github/scripts/is_release_for_package.sh "@e2b/desktop-python") + echo "release=$IS_RELEASE" >> "$GITHUB_OUTPUT" publish: name: Publish @@ -99,8 +127,8 @@ jobs: - name: Release Failed - Slack Notification uses: rtCamp/action-slack-notify@v2 env: - SLACK_COLOR: "#ff0000" - SLACK_MESSAGE: ":here-we-go-again: :bob-the-destroyer: We need :fix-parrot: ASAP :pray:" + SLACK_COLOR: '#ff0000' + SLACK_MESSAGE: ':here-we-go-again: :bob-the-destroyer: We need :fix-parrot: ASAP :pray:' SLACK_TITLE: Release Failed SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - SLACK_CHANNEL: "monitoring-releases" + SLACK_CHANNEL: 'monitoring-releases' diff --git a/.github/workflows/template.yml b/.github/workflows/template.yml index cfc4383..223fdb2 100644 --- a/.github/workflows/template.yml +++ b/.github/workflows/template.yml @@ -3,8 +3,8 @@ name: Build and push Desktop template on: push: paths: - - "template/**" - - ".github/workflows/template.yml" + - 'template/**' + - '.github/workflows/template.yml' branches: - main @@ -18,11 +18,35 @@ jobs: working-directory: ./template name: Build and Push Images - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Checkout repository uses: actions/checkout@v3 + - name: Parse .tool-versions + uses: wistia/parse-tool-versions@v2.1.1 + id: tool-versions + with: + filename: '.tool-versions' + uppercase: 'true' + prefix: 'tool_version_' + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '${{ env.TOOL_VERSION_PYTHON }}' + + - name: Install and configure Poetry + uses: snok/install-poetry@v1 + with: + version: ${{ env.TOOL_VERSION_POETRY }} + virtualenvs-create: true + virtualenvs-in-project: true + installer-parallel: true + + - name: Install dependencies + run: poetry install + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 @@ -35,16 +59,12 @@ jobs: - name: Build and push to DockerHub run: | docker pull ${{ secrets.DOCKERHUB_USERNAME }}/desktop:latest || true - docker buildx build \ - --file e2b.Dockerfile \ - --platform linux/amd64,linux/arm64 \ + poetry run python build_docker.py | docker buildx build \ + --platform linux/amd64 \ --push \ - --tag ${{ secrets.DOCKERHUB_USERNAME }}/desktop:latest . - - - name: Install E2B CLI - run: npm install -g @e2b/cli + --tag ${{ secrets.DOCKERHUB_USERNAME }}/desktop:latest -f - files - - name: Build e2b - run: e2b template build + - name: Build E2B template + run: poetry run python build_prod.py env: - E2B_ACCESS_TOKEN: ${{ secrets.E2B_ACCESS_TOKEN }} + E2B_API_KEY: ${{ secrets.E2B_API_KEY }} diff --git a/.github/workflows/validate-renovate-config.yaml b/.github/workflows/validate-renovate-config.yaml new file mode 100644 index 0000000..8378c56 --- /dev/null +++ b/.github/workflows/validate-renovate-config.yaml @@ -0,0 +1,18 @@ +name: validate renovate config + +on: + pull_request: + branches: + - main + +jobs: + validate-renovate-config: + runs-on: ubuntu-24.04 + permissions: + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@v6 + + - name: Validate Renovate config + uses: suzuki-shunsuke/github-action-renovate-config-validator@v2.1.0 diff --git a/.gitignore b/.gitignore index 4d709de..f8e7061 100644 --- a/.gitignore +++ b/.gitignore @@ -293,5 +293,4 @@ cython_debug/ # VS Code -# SDK reference artifacts -sdk_ref/ +.ruff_cache/ diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..5557498 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "semi": false, + "trailingComma": "es5" + } \ No newline at end of file diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000..a6551be --- /dev/null +++ b/.tool-versions @@ -0,0 +1,4 @@ +nodejs 20.20.1 +pnpm 9.15.9 +python 3.10 +poetry 2.3.2 diff --git a/README.md b/README.md index deb2c50..fdffb05 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,22 @@ Each sandbox is isolated from the others and can be customized with any dependen ## Examples -**Basic SDK Examples** +**SDK Examples** -- Check out the examples directory for more examples on how to use the SDK: - - [Python](./examples/basic-python) - - [JavaScript](./examples/basic-javascript) +- Basic Examples: + - [Python](./examples/basic-python) + - [JavaScript](./examples/basic-javascript) +- Streaming Desktop Applications: + - [Python](./examples/streaming-apps-python) + - [JavaScript](./examples/streaming-apps-javascript) **[Open Computer Use](https://github.com/e2b-dev/open-computer-use)** - + - Computer use made with 100% open source LLMs. **[🏄 Surf](https://github.com/e2b-dev/surf)** -- OpenAI Computer Use Agent using E2B's Desktop Sandbox. Runs as a Next.js app. +- OpenAI Computer Use Agent using E2B's Desktop Sandbox. Runs as a Next.js app. ## 🚀 Getting started @@ -52,15 +55,31 @@ npm install @e2b/desktop ```python from e2b_desktop import Sandbox -# Basic initialization -desktop = Sandbox() +# Create a new desktop sandbox +desktop = Sandbox.create() + +# Launch an application +desktop.launch('google-chrome') # or vscode, firefox, etc. + +# Wait 10s for the application to open +desktop.wait(10000) -# With custom configuration -desktop = Sandbox( - display=":0", # Custom display (defaults to :0) - resolution=(1920, 1080), # Custom resolution - dpi=96, # Custom DPI +# Stream the application's window +# Note: There can be only one stream at a time +# You need to stop the current stream before streaming another application +desktop.stream.start( + window_id=desktop.get_current_window_id(), # if not provided the whole desktop will be streamed + require_auth=True ) + +# Get the stream auth key +auth_key = desktop.stream.get_auth_key() + +# Print the stream URL +print('Stream URL:', desktop.stream.get_url(auth_key=auth_key)) + +# Kill the sandbox after the tasks are finished +# desktop.kill() ``` **JavaScript** @@ -68,15 +87,31 @@ desktop = Sandbox( ```javascript import { Sandbox } from '@e2b/desktop' -// Basic initialization +// Start a new desktop sandbox const desktop = await Sandbox.create() -// With custom configuration -const desktop = await Sandbox.create({ - display: ':0', // Custom display (defaults to :0) - resolution: [1920, 1080], // Custom resolution - dpi: 96, // Custom DPI +// Launch an application +await desktop.launch('google-chrome') // or vscode, firefox, etc. + +// Wait 10s for the application to open +await desktop.wait(10000) + +// Stream the application's window +// Note: There can be only one stream at a time +// You need to stop the current stream before streaming another application +await desktop.stream.start({ + windowId: await desktop.getCurrentWindowId(), // if not provided the whole desktop will be streamed + requireAuth: true, }) + +// Get the stream auth key +const authKey = desktop.stream.getAuthKey() + +// Print the stream URL +console.log('Stream URL:', desktop.stream.getUrl({ authKey })) + +// Kill the sandbox after the tasks are finished +// await desktop.kill() ``` ## Features @@ -87,7 +122,7 @@ const desktop = await Sandbox.create({ ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Start the stream desktop.stream.start() @@ -96,6 +131,10 @@ desktop.stream.start() url = desktop.stream.get_url() print(url) +# Get stream URL and disable user interaction +url = desktop.stream.get_url(view_only=True) +print(url) + # Stop the stream desktop.stream.stop() ``` @@ -114,6 +153,10 @@ await desktop.stream.start() const url = desktop.stream.getUrl() console.log(url) +// Get stream URL and disable user interaction +const url = desktop.stream.getUrl({ viewOnly: true }) +console.log(url) + // Stop the stream await desktop.stream.stop() ``` @@ -124,7 +167,7 @@ await desktop.stream.stop() ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Start the stream desktop.stream.start( @@ -165,13 +208,60 @@ console.log(url) await desktop.stream.stop() ``` +### Streaming specific application + +> [!WARNING] +> +> - Will raise an error if the desired application is not open yet +> - The stream will close once the application closes +> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application + +**Python** + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Get current (active) window ID +window_id = desktop.get_current_window_id() + +# Get all windows of the application +window_ids = desktop.get_application_windows("Firefox") + +# Start the stream +desktop.stream.start(window_id=window_ids[0]) + +# Stop the stream +desktop.stream.stop() +``` + +**JavaScript** + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Get current (active) window ID +const windowId = await desktop.getCurrentWindowId() + +// Get all windows of the application +const windowIds = await desktop.getApplicationWindows('Firefox') + +// Start the stream +await desktop.stream.start({ windowId: windowIds[0] }) + +// Stop the stream +await desktop.stream.stop() +``` + ### Mouse control **Python** ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() desktop.double_click() desktop.left_click() @@ -204,8 +294,8 @@ await desktop.middleClick(100, 200) await desktop.scroll(10) // Scroll by the amount. Positive for up, negative for down. await desktop.moveMouse(100, 200) // Move to x, y coordinates await desktop.drag([100, 100], [200, 200]) // Drag using the mouse -await desktop.mousePress("left") // Press the mouse button -await desktop.mouseRelease("left") // Release the mouse button +await desktop.mousePress('left') // Press the mouse button +await desktop.mouseRelease('left') // Release the mouse button ``` ### Keyboard control @@ -214,7 +304,7 @@ await desktop.mouseRelease("left") // Release the mouse button ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Write text at the current cursor position with customizable typing speed desktop.write("Hello, world!") # Default: chunk_size=25, delay_in_ms=75 @@ -245,13 +335,48 @@ await desktop.press('backspace') await desktop.press(['ctrl', 'c']) // Key combination ``` +### Window control + +**Python** + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Get current (active) window ID +window_id = desktop.get_current_window_id() + +# Get all windows of the application +window_ids = desktop.get_application_windows("Firefox") + +# Get window title +title = desktop.get_window_title(window_id) +``` + +**JavaScript** + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Get current (active) window ID +const windowId = await desktop.getCurrentWindowId() + +// Get all windows of the application +const windowIds = await desktop.getApplicationWindows('Firefox') + +// Get window title +const title = await desktop.getWindowTitle(windowId) +``` + ### Screenshot **Python** ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Take a screenshot and save it as "screenshot.png" locally image = desktop.screenshot() @@ -277,7 +402,7 @@ fs.writeFileSync('screenshot.png', image) ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Open file with default application desktop.files.write("/home/user/index.js", "console.log('hello')") # First create the file @@ -296,13 +421,36 @@ await desktop.files.write('/home/user/index.js', "console.log('hello')") // Firs await desktop.open('/home/user/index.js') // Then open it ``` +### Launch applications + +**Python** + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Launch the application +desktop.launch('google-chrome') +``` + +**JavaScript** + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Launch the application +await desktop.launch('google-chrome') +``` + ### Run any bash commands **Python** ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Run any bash command out = desktop.commands.run("ls -la /home/user") @@ -327,10 +475,10 @@ console.log(out) ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() desktop.wait(1000) # Wait for 1 second -``` +``` **JavaScript** diff --git a/examples/basic-javascript/package-lock.json b/examples/basic-javascript/package-lock.json index f71ada9..4630bc3 100644 --- a/examples/basic-javascript/package-lock.json +++ b/examples/basic-javascript/package-lock.json @@ -338,9 +338,9 @@ } }, "node_modules/electron": { - "version": "35.0.1", - "resolved": "https://registry.npmjs.org/electron/-/electron-35.0.1.tgz", - "integrity": "sha512-iQonj6lnPhqfqha2KXx6LzV1dnu6UPTCWK+b7f9Zvg828umGemi22DKbcJ3/q+Opn7iUVTWyqp9z1JQqkIi6OA==", + "version": "35.7.5", + "resolved": "https://registry.npmjs.org/electron/-/electron-35.7.5.tgz", + "integrity": "sha512-dnL+JvLraKZl7iusXTVTGYs10TKfzUi30uEDTqsmTm0guN9V2tbOjTzyIZbh9n3ygUjgEYyo+igAwMRXIi3IPw==", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/examples/basic-python/main.py b/examples/basic-python/main.py index e341cc8..1db5ad7 100644 --- a/examples/basic-python/main.py +++ b/examples/basic-python/main.py @@ -44,7 +44,7 @@ def check_queue(): def main(): print("> Starting desktop sandbox...") - desktop = Sandbox() + desktop = Sandbox.create() print(" - Desktop Sandbox started, ID:", desktop.sandbox_id) width, height = desktop.get_screen_size() diff --git a/examples/basic-python/poetry.lock b/examples/basic-python/poetry.lock index fa3c5c9..0c73549 100644 --- a/examples/basic-python/poetry.lock +++ b/examples/basic-python/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "anyio" @@ -6,6 +6,7 @@ version = "4.8.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, @@ -18,7 +19,7 @@ typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] trio = ["trio (>=0.26.1)"] [[package]] @@ -27,18 +28,19 @@ version = "25.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] [[package]] name = "bottle" @@ -46,6 +48,7 @@ version = "0.13.2" description = "Fast and simple WSGI-framework for small web-applications." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "bottle-0.13.2-py2.py3-none-any.whl", hash = "sha256:27569ab8d1332fbba3e400b3baab2227ab4efb4882ff147af05a7c00ed73409c"}, {file = "bottle-0.13.2.tar.gz", hash = "sha256:e53803b9d298c7d343d00ba7d27b0059415f04b9f6f40b8d58b5bf914ba9d348"}, @@ -57,6 +60,7 @@ version = "2025.1.31" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, @@ -68,6 +72,7 @@ version = "3.4.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, @@ -169,6 +174,7 @@ version = "1.1.0" description = "E2B SDK that give agents cloud environments" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "e2b-1.1.0-py3-none-any.whl", hash = "sha256:5d99c675e155cf124f457d77f91c4cb32b286d241ca6cd37ac8d6c0711fc272e"}, {file = "e2b-1.1.0.tar.gz", hash = "sha256:bd054fbaa9baed48919500ba853bdb72c750b04e0bac8365bde75cdfbdf80d18"}, @@ -189,6 +195,7 @@ version = "1.2.0" description = "E2B Desktop Sandbox - Deskstop sandbox in cloud powered by E2B" optional = false python-versions = "<4.0,>=3.9" +groups = ["main"] files = [ {file = "e2b_desktop-1.2.0-py3-none-any.whl", hash = "sha256:239669e15d0ee630fa26d7b257f5f8e82f7dd8575e50fa47dbac7f7bf7b8d8b1"}, {file = "e2b_desktop-1.2.0.tar.gz", hash = "sha256:5100e40f83ef96d856af3e0516b53568030e6a472337f2f5aee65ddc6f8c5062"}, @@ -201,29 +208,31 @@ requests = ">=2.32.3,<3.0.0" [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "httpcore" -version = "1.0.7" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] @@ -237,6 +246,7 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, @@ -249,7 +259,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -261,6 +271,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -275,6 +286,7 @@ version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, @@ -286,6 +298,7 @@ version = "11.1.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, @@ -365,27 +378,28 @@ docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] name = "protobuf" -version = "5.29.3" +version = "5.29.6" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "protobuf-5.29.3-cp310-abi3-win32.whl", hash = "sha256:3ea51771449e1035f26069c4c7fd51fba990d07bc55ba80701c78f886bf9c888"}, - {file = "protobuf-5.29.3-cp310-abi3-win_amd64.whl", hash = "sha256:a4fa6f80816a9a0678429e84973f2f98cbc218cca434abe8db2ad0bffc98503a"}, - {file = "protobuf-5.29.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8434404bbf139aa9e1300dbf989667a83d42ddda9153d8ab76e0d5dcaca484e"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:daaf63f70f25e8689c072cfad4334ca0ac1d1e05a92fc15c54eb9cf23c3efd84"}, - {file = "protobuf-5.29.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:c027e08a08be10b67c06bf2370b99c811c466398c357e615ca88c91c07f0910f"}, - {file = "protobuf-5.29.3-cp38-cp38-win32.whl", hash = "sha256:84a57163a0ccef3f96e4b6a20516cedcf5bb3a95a657131c5c3ac62200d23252"}, - {file = "protobuf-5.29.3-cp38-cp38-win_amd64.whl", hash = "sha256:b89c115d877892a512f79a8114564fb435943b59067615894c3b13cd3e1fa107"}, - {file = "protobuf-5.29.3-cp39-cp39-win32.whl", hash = "sha256:0eb32bfa5219fc8d4111803e9a690658aa2e6366384fd0851064b963b6d1f2a7"}, - {file = "protobuf-5.29.3-cp39-cp39-win_amd64.whl", hash = "sha256:6ce8cc3389a20693bfde6c6562e03474c40851b44975c9b2bf6df7d8c4f864da"}, - {file = "protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f"}, - {file = "protobuf-5.29.3.tar.gz", hash = "sha256:5da0f41edaf117bde316404bad1a486cb4ededf8e4a54891296f648e8e076620"}, + {file = "protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1"}, + {file = "protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda"}, + {file = "protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9"}, + {file = "protobuf-5.29.6-cp38-cp38-win32.whl", hash = "sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05"}, + {file = "protobuf-5.29.6-cp38-cp38-win_amd64.whl", hash = "sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6"}, + {file = "protobuf-5.29.6-cp39-cp39-win32.whl", hash = "sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49"}, + {file = "protobuf-5.29.6-cp39-cp39-win_amd64.whl", hash = "sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18"}, + {file = "protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86"}, + {file = "protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723"}, ] [[package]] @@ -394,6 +408,7 @@ version = "0.1.0" description = "Proxy Implementation" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "proxy_tools-0.1.0.tar.gz", hash = "sha256:ccb3751f529c047e2d8a58440d86b205303cf0fe8146f784d1cbcd94f0a28010"}, ] @@ -404,6 +419,8 @@ version = "2.22" description = "C parser in Python" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"win32\"" files = [ {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, @@ -415,6 +432,8 @@ version = "11.0" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" +groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_core-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:10866b3a734d47caf48e456eea0d4815c2c9b21856157db5917b61dee06893a1"}, {file = "pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd"}, @@ -431,6 +450,8 @@ version = "11.0" description = "Wrappers for the Cocoa frameworks on macOS" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_framework_Cocoa-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fbc65f260d617d5463c7fb9dbaaffc23c9a4fabfe3b1a50b039b61870b8daefd"}, {file = "pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33"}, @@ -450,6 +471,8 @@ version = "11.0" description = "Wrappers for the Quartz frameworks on macOS" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_framework_Quartz-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da3ab13c9f92361959b41b0ad4cdd41ae872f90a6d8c58a9ed699bc08ab1c45c"}, {file = "pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2"}, @@ -470,6 +493,8 @@ version = "11.0" description = "Wrappers for the framework Security on macOS" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_framework_Security-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2db348ba43aff24ae71d239ed585bf061e61f84a50226677049ed220737ffd0"}, {file = "pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526"}, @@ -490,6 +515,8 @@ version = "11.0" description = "Wrappers for the framework WebKit on macOS" optional = false python-versions = ">=3.9" +groups = ["main"] +markers = "sys_platform == \"darwin\"" files = [ {file = "pyobjc_framework_WebKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1881d7443f916e49199fd9d4b109c19e3e063ab3a60e6d4d76299a3b9143ef6"}, {file = "pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed"}, @@ -510,6 +537,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -524,6 +552,7 @@ version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, @@ -538,6 +567,8 @@ version = "2.5.2" description = ".Net and Mono integration for Python" optional = false python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\"" files = [ {file = "pythonnet-2.5.2-cp27-cp27m-win32.whl", hash = "sha256:d519bbc7b1cd3999651efc594d91cb67c46d1d8466dad3d83b578102e58d05bd"}, {file = "pythonnet-2.5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:c02f53d0e61b202cddf3198fac9553d5b4ee0ea0cc4fe658c2ed69ab24def276"}, @@ -561,6 +592,7 @@ version = "5.4" description = "Build GUI for your Python program with JavaScript, HTML, and CSS" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "pywebview-5.4-py3-none-any.whl", hash = "sha256:0559c47db543556498dd38604a2a0479896c320f86c9b23499b8e580b58b699d"}, {file = "pywebview-5.4.tar.gz", hash = "sha256:b5e2c6c7502aaf72a9ae6034daf83785f5fad874fac7fa82bf4fcf854f1f083a"}, @@ -595,6 +627,8 @@ version = "2.4.3" description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." optional = false python-versions = ">=3.7" +groups = ["main"] +markers = "sys_platform == \"openbsd6\"" files = [ {file = "QtPy-2.4.3-py3-none-any.whl", hash = "sha256:72095afe13673e017946cc258b8d5da43314197b741ed2890e563cf384b51aa1"}, {file = "qtpy-2.4.3.tar.gz", hash = "sha256:db744f7832e6d3da90568ba6ccbca3ee2b3b4a890c3d6fbbc63142f6e4cdf5bb"}, @@ -608,24 +642,26 @@ test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] [[package]] name = "requests" -version = "2.32.3" +version = "2.33.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["main"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b"}, + {file = "requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"}, ] [package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +test = ["PySocks (>=1.5.6,!=1.5.7)", "pytest (>=3)", "pytest-cov", "pytest-httpbin (==2.1.0)", "pytest-mock", "pytest-xdist"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] name = "six" @@ -633,6 +669,7 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -644,6 +681,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -655,6 +693,7 @@ version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -662,22 +701,23 @@ files = [ [[package]] name = "urllib3" -version = "2.3.0" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, - {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.11" content-hash = "07d1c609d6b5f94ac722ef8b9f76fc063edad64a758e8c94108ff3398dc04ef0" diff --git a/examples/readme-assets/chrome.png b/examples/readme-assets/chrome.png new file mode 100644 index 0000000..aaa8193 Binary files /dev/null and b/examples/readme-assets/chrome.png differ diff --git a/examples/readme-assets/vscode.png b/examples/readme-assets/vscode.png new file mode 100644 index 0000000..fe21d26 Binary files /dev/null and b/examples/readme-assets/vscode.png differ diff --git a/examples/streaming-apps-javascript/README.md b/examples/streaming-apps-javascript/README.md new file mode 100644 index 0000000..434b34a --- /dev/null +++ b/examples/streaming-apps-javascript/README.md @@ -0,0 +1,96 @@ +# Streaming Applications Example + +Streaming applications is a feature of the E2B Desktop Sandbox. + +| Streaming Chrome Window | Streaming VS Code Window | +| ------------------------------------------------------- | -------------------------------------------------------- | +| ![Chrome streaming window](../readme-assets/chrome.png) | ![VS Code streaming window](../readme-assets/vscode.png) | + +> [!WARNING] +> +> - Will raise an error if the desired application is not open yet +> - The stream will close once the application closes +> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application + +## How to run + +### 1. Get E2B API key + +Sign up at [E2B](https://e2b.dev) and get your API key. +Set environment variable `E2B_API_KEY` with your API key. + +### 2. Install SDK + +```bash +npm install @e2b/desktop +``` + +### 3. Create Desktop Sandbox + +```javascript +import { Sandbox } from '@e2b/desktop' + +// Start a new desktop sandbox +const desktop = await Sandbox.create() +console.log('Desktop sandbox created', desktop.sandboxId) + +// Launch an application +console.log('Launching Google Chrome') +await desktop.launch('google-chrome') // or vscode, firefox, etc. + +// Wait 15s for the application to open +await desktop.wait(15000) + +// Stream the application's window +// Note: there can be only one stream at a time +// You need to stop the current stream before streaming another application +console.log('Starting to stream Google Chrome') +await desktop.stream.start({ + windowId: await desktop.getCurrentWindowId(), // if not provided the whole desktop will be streamed + requireAuth: true, +}) + +// Get the stream auth key +const authKey = desktop.stream.getAuthKey() + +// Print the stream URL +console.log('Stream URL:', desktop.stream.getUrl({ authKey })) + +// Do some actions in the application +console.log('Writing to Google Chrome') +await desktop.write('What is the capital of Germany?') + +console.log('Pressing Enter') +await desktop.press('Enter') + +// wait 15s for page to load +console.log('Waiting 15s') +await desktop.wait(15000) + +// Stop the stream +console.log('Stopping the stream') +await desktop.stream.stop() + +// Open another application +console.log('Launching VS Code') +await desktop.launch('code') + +// Wait 15s for the application to open +await desktop.wait(15000) + +// Start streaming the new application +console.log('Starting to stream VS Code') +await desktop.stream.start({ + windowId: await desktop.getCurrentWindowId(), // if not provided the whole desktop will be streamed + requireAuth: true, +}) + +// Get the stream auth key +const authKey2 = desktop.stream.getAuthKey() + +// Print the stream URL +console.log('Stream URL:', desktop.stream.getUrl({ authKey: authKey2 })) + +// Kill the sandbox after the tasks are finished +// await desktop.kill() +``` diff --git a/examples/streaming-apps-python/README.md b/examples/streaming-apps-python/README.md new file mode 100644 index 0000000..26d37a7 --- /dev/null +++ b/examples/streaming-apps-python/README.md @@ -0,0 +1,96 @@ +# Streaming Applications Example + +Streaming applications is a feature of the E2B Desktop Sandbox. + +| Streaming Chrome Window | Streaming VS Code Window | +| ------------------------------------------------------- | -------------------------------------------------------- | +| ![Chrome streaming window](../readme-assets/chrome.png) | ![VS Code streaming window](../readme-assets/vscode.png) | + +> [!WARNING] +> +> - Will raise an error if the desired application is not open yet +> - The stream will close once the application closes +> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application + +## How to run + +### 1. Get E2B API key + +Sign up at [E2B](https://e2b.dev) and get your API key. +Set environment variable `E2B_API_KEY` with your API key. + +### 2. Install SDK + +```bash +pip install e2b-desktop +``` + +### 3. Create Desktop Sandbox + +```python +from e2b_desktop import Sandbox + +# Create a new desktop sandbox +desktop = Sandbox.create() +print('Desktop sandbox created', desktop.sandbox_id) + +# Launch an application +print('Launching Google Chrome') +desktop.launch('google-chrome') # or vscode, firefox, etc. + +# Wait 15s for the application to open +desktop.wait(15000) + +# Stream the application's window +# Note: there can be only one stream at a time +# You need to stop the current stream before streaming another application +print('Starting to stream Google Chrome') +desktop.stream.start( + window_id=desktop.get_current_window_id(), # if not provided the whole desktop will be streamed + require_auth=True, +) + +# Get the stream auth key +auth_key = desktop.stream.get_auth_key() + +# Print the stream URL +print('Stream URL:', desktop.stream.get_url(auth_key=auth_key)) + +# Do some actions in the application +print('Writing to Google Chrome') +desktop.write('What is the capital of Germany?') + +print('Pressing Enter') +desktop.press('enter') + +# wait 15s for page to load +print('Waiting 15s') +desktop.wait(15000) + +# Stop the stream +print('Stopping the stream') +desktop.stream.stop() + +# Open another application +print('Launching VS Code') +desktop.launch('code') + +# Wait 15s for the application to open +desktop.wait(15000) + +# Start streaming the new application +print('Starting to stream VS Code') +desktop.stream.start( + window_id=desktop.get_current_window_id(), # if not provided the whole desktop will be streamed + require_auth=True, +) + +# Get the stream auth key +auth_key2 = desktop.stream.get_auth_key() + +# Print the stream URL +print('Stream URL:', desktop.stream.get_url(auth_key=auth_key2)) + +# Kill the sandbox after the tasks are finished +# desktop.kill() +``` diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index f15babe..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1431 +0,0 @@ -{ - "name": "e2b-desktop-root", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "e2b-desktop-root", - "devDependencies": { - "@changesets/cli": "^2.26.2", - "@changesets/read": "^0.5.9", - "changeset": "^0.2.6" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", - "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.8.tgz", - "integrity": "sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==", - "dev": true, - "dependencies": { - "@changesets/config": "^3.0.5", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.5.tgz", - "integrity": "sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", - "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0" - } - }, - "node_modules/@changesets/cli": { - "version": "2.27.12", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.12.tgz", - "integrity": "sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==", - "dev": true, - "dependencies": { - "@changesets/apply-release-plan": "^7.0.8", - "@changesets/assemble-release-plan": "^6.0.5", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.5", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/get-release-plan": "^4.0.6", - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/pre": "^2.0.1", - "@changesets/read": "^0.6.2", - "@changesets/should-skip-package": "^0.1.1", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.2", - "@manypkg/get-packages": "^1.1.3", - "ansi-colors": "^4.1.3", - "ci-info": "^3.7.0", - "enquirer": "^2.4.1", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "mri": "^1.2.0", - "p-limit": "^2.2.0", - "package-manager-detector": "^0.2.0", - "picocolors": "^1.1.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^3.0.1", - "term-size": "^2.1.0" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/cli/node_modules/@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/cli/node_modules/@changesets/read": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz", - "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==", - "dev": true, - "dependencies": { - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/config": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.5.tgz", - "integrity": "sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.1.2", - "@changesets/logger": "^0.1.1", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.8" - } - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.2.tgz", - "integrity": "sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "picocolors": "^1.1.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.6.tgz", - "integrity": "sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==", - "dev": true, - "dependencies": { - "@changesets/assemble-release-plan": "^6.0.5", - "@changesets/config": "^3.0.5", - "@changesets/pre": "^2.0.1", - "@changesets/read": "^0.6.2", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-release-plan/node_modules/@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/get-release-plan/node_modules/@changesets/read": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.2.tgz", - "integrity": "sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==", - "dev": true, - "dependencies": { - "@changesets/git": "^3.0.2", - "@changesets/logger": "^0.1.1", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0", - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true - }, - "node_modules/@changesets/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.2.tgz", - "integrity": "sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.8", - "spawndamnit": "^3.0.1" - } - }, - "node_modules/@changesets/logger": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.1.tgz", - "integrity": "sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==", - "dev": true, - "dependencies": { - "picocolors": "^1.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.3.16.tgz", - "integrity": "sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==", - "dev": true, - "dependencies": { - "@changesets/types": "^5.2.1", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/parse/node_modules/@changesets/types": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", - "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", - "dev": true - }, - "node_modules/@changesets/pre": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.1.tgz", - "integrity": "sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/read": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.5.9.tgz", - "integrity": "sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^2.0.0", - "@changesets/logger": "^0.0.5", - "@changesets/parse": "^0.3.16", - "@changesets/types": "^5.2.1", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" - } - }, - "node_modules/@changesets/read/node_modules/@changesets/errors": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.1.4.tgz", - "integrity": "sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==", - "dev": true, - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/read/node_modules/@changesets/git": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-2.0.0.tgz", - "integrity": "sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.1.4", - "@changesets/types": "^5.2.1", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" - } - }, - "node_modules/@changesets/read/node_modules/@changesets/logger": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.0.5.tgz", - "integrity": "sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==", - "dev": true, - "dependencies": { - "chalk": "^2.1.0" - } - }, - "node_modules/@changesets/read/node_modules/@changesets/types": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-5.2.1.tgz", - "integrity": "sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==", - "dev": true - }, - "node_modules/@changesets/read/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/@changesets/read/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@changesets/read/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@changesets/read/node_modules/spawndamnit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", - "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/@changesets/read/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/@changesets/should-skip-package": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@changesets/should-skip-package/-/should-skip-package-0.1.1.tgz", - "integrity": "sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/write": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.2.tgz", - "integrity": "sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - } - }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", - "dev": true - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/changeset": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/changeset/-/changeset-0.2.6.tgz", - "integrity": "sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==", - "dev": true, - "dependencies": { - "udc": "^1.0.0", - "underscore": "^1.8.3" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/enquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/enquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/human-id": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", - "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-manager-detector": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.8.tgz", - "integrity": "sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawndamnit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-3.0.1.tgz", - "integrity": "sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.5", - "signal-exit": "^4.0.1" - } - }, - "node_modules/spawndamnit/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/udc": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/udc/-/udc-1.0.1.tgz", - "integrity": "sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==", - "dev": true - }, - "node_modules/underscore": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", - "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", - "dev": true - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } - } -} \ No newline at end of file diff --git a/package.json b/package.json index d27d7b6..ff5b10d 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,22 @@ "name": "e2b-desktop-root", "private": true, "scripts": { - "version": "changeset version && pnpm run -r postVersion", - "publish": "changeset publish && pnpm run -r postPublish", - "rm-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +" + "version": "pnpm changeset version && pnpm run -r postVersion", + "publish": "pnpm changeset publish && pnpm run -r postPublish", + "rm-node-modules": "find . -name 'node_modules' -type d -prune -exec rm -rf '{}' +", + "lint": "pnpm --if-present --recursive run lint", + "format": "pnpm --if-present --recursive run format", + "changeset": "pnpx @changesets/cli" }, - "packageManager": "pnpm@8.7.6", + "packageManager": "pnpm@9.15.9", "devDependencies": { - "@changesets/cli": "^2.26.2", - "@changesets/read": "^0.5.9", - "changeset": "^0.2.6" + "@changesets/read": "^0.6.5", + "changeset": "^0.2.6", + "@typescript-eslint/eslint-plugin": "^6.7.2", + "@typescript-eslint/parser": "^6.7.2", + "eslint": "^8.57.1", + "eslint-plugin-unused-imports": "^3.0.0", + "@stylistic/eslint-plugin-ts": "^1.6.2", + "prettier": "^3.6.2" } } \ No newline at end of file diff --git a/packages/js-sdk/.eslintrc.cjs b/packages/js-sdk/.eslintrc.cjs new file mode 100644 index 0000000..b7ecaaf --- /dev/null +++ b/packages/js-sdk/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '../../.eslintrc.cjs', +} diff --git a/packages/js-sdk/LICENSE b/packages/js-sdk/LICENSE new file mode 100644 index 0000000..4aa6529 --- /dev/null +++ b/packages/js-sdk/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 FOUNDRYLABS, INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/js-sdk/README.md b/packages/js-sdk/README.md index 3055327..09acfea 100644 --- a/packages/js-sdk/README.md +++ b/packages/js-sdk/README.md @@ -15,6 +15,7 @@ Check out the [example open-source app](https://github.com/e2b-dev/open-computer ### Basic SDK usage examples Check out the examples directory for more examples on how to use the SDK: + - [Python](./examples/basic-python) - [JavaScript](./examples/basic-javascript) @@ -38,15 +39,31 @@ npm install @e2b/desktop ```javascript import { Sandbox } from '@e2b/desktop' -// Basic initialization +// Start a new desktop sandbox const desktop = await Sandbox.create() -// With custom configuration -const desktop = await Sandbox.create({ - display: ':0', // Custom display (defaults to :0) - resolution: [1920, 1080], // Custom resolution - dpi: 96 // Custom DPI +// Launch an application +await desktop.launch('google-chrome') // or vscode, firefox, etc. + +// Wait 10s for the application to open +await desktop.wait(10000) + +// Stream the application's window +// Note: there can be only one stream at a time +// You need to stop the current stream before streaming another application +await desktop.stream.start({ + windowId: await desktop.getCurrentWindowId(), // if not provided the whole desktop will be streamed + requireAuth: true, }) + +// Get the stream auth key +const authKey = desktop.stream.getAuthKey() + +// Print the stream URL +console.log('Stream URL:', desktop.stream.getUrl({ authKey })) + +// Kill the sandbox after the tasks are finished +// await desktop.kill() ``` ## Features @@ -92,6 +109,32 @@ console.log(url) await desktop.stream.stop() ``` +### Streaming specific application + +> [!WARNING] +> +> - Will throw an error if the desired application is not open yet +> - The stream will close once the application closes +> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Get current (active) window ID +const windowId = await desktop.getCurrentWindowId() + +// Get all windows of the application +const windowIds = await desktop.getApplicationWindows('Firefox') + +// Start the stream +await desktop.stream.start({ windowId: windowIds[0] }) + +// Stop the stream +await desktop.stream.stop() +``` + ### Mouse control ```javascript @@ -109,8 +152,8 @@ await desktop.middleClick(100, 200) await desktop.scroll(10) // Scroll by the amount. Positive for up, negative for down. await desktop.moveMouse(100, 200) // Move to x, y coordinates await desktop.drag([100, 100], [200, 200]) // Drag using the mouse -await desktop.mousePress("left") // Press the mouse button -await desktop.mouseRelease("left") // Release the mouse button +await desktop.mousePress('left') // Press the mouse button +await desktop.mouseRelease('left') // Release the mouse button ``` ### Keyboard control @@ -131,6 +174,23 @@ await desktop.press('backspace') await desktop.press(['ctrl', 'c']) // Key combination ``` +### Window control + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Get current (active) window ID +const windowId = await desktop.getCurrentWindowId() + +// Get all windows of the application +const windowIds = await desktop.getApplicationWindows('Firefox') + +// Get window title +const title = await desktop.getWindowTitle(windowId) +``` + ### Screenshot ```javascript @@ -154,6 +214,17 @@ await desktop.files.write('/home/user/index.js', "console.log('hello')") // Firs await desktop.open('/home/user/index.js') // Then open it ``` +### Launch applications + +```javascript +import { Sandbox } from '@e2b/desktop' + +const desktop = await Sandbox.create() + +// Launch the application +await desktop.launch('google-chrome') +``` + ### Run any bash commands ```javascript diff --git a/packages/js-sdk/example.mts b/packages/js-sdk/example.mts index 90a3e43..3fca926 100644 --- a/packages/js-sdk/example.mts +++ b/packages/js-sdk/example.mts @@ -2,47 +2,44 @@ import { config } from 'dotenv' config() import { Sandbox } from './dist' -import { writeFileSync } from 'fs'; +import { writeFileSync } from 'fs' +console.log('Starting desktop sandbox...') -console.log("Starting desktop sandbox...") +console.time('--> Sandbox creation time') +const desktop = await Sandbox.create() +console.timeEnd('--> Sandbox creation time') -console.time('--> Sandbox creation time'); -const desktop = await Sandbox.create(); -console.timeEnd('--> Sandbox creation time'); - -console.log("Desktop Sandbox started, ID:", desktop.sandboxId) -console.log("Screen size:", await desktop.getScreenSize()) +console.log('Desktop Sandbox started, ID:', desktop.sandboxId) +console.log('Screen size:', await desktop.getScreenSize()) await desktop.stream.start({ - requireAuth: true + requireAuth: true, }) const authKey = await desktop.stream.getAuthKey() -console.log("Stream URL:", desktop.stream.getUrl({ authKey })) +console.log('Stream URL:', desktop.stream.getUrl({ authKey })) -await new Promise(resolve => setTimeout(resolve, 5000)); +await new Promise((resolve) => setTimeout(resolve, 5000)) console.log("Moving mouse to 'Applications' and clicking...") await desktop.moveMouse(100, 100) await desktop.leftClick() -console.log("Cursor position:", await desktop.getCursorPosition()) - -await new Promise(resolve => setTimeout(resolve, 1000)); +console.log('Cursor position:', await desktop.getCursorPosition()) -const screenshot = await desktop.screenshot("bytes") -writeFileSync('1.png', Buffer.from(screenshot)); +await new Promise((resolve) => setTimeout(resolve, 1000)) +const screenshot = await desktop.screenshot('bytes') +writeFileSync('1.png', Buffer.from(screenshot)) for (let i = 0; i < 20; i++) { - const x = Math.floor(Math.random() * 1024); - const y = Math.floor(Math.random() * 768); - await desktop.moveMouse(x, y); - await new Promise(resolve => setTimeout(resolve, 2000)); - await desktop.rightClick(); + const x = Math.floor(Math.random() * 1024) + const y = Math.floor(Math.random() * 768) + await desktop.moveMouse(x, y) + await new Promise((resolve) => setTimeout(resolve, 2000)) + await desktop.rightClick() console.log('right clicked', i) } - await desktop.stream.stop() await desktop.kill() diff --git a/packages/js-sdk/package-lock.json b/packages/js-sdk/package-lock.json deleted file mode 100644 index 297ff14..0000000 --- a/packages/js-sdk/package-lock.json +++ /dev/null @@ -1,2950 +0,0 @@ -{ - "name": "@e2b/desktop", - "version": "1.0.3", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@e2b/desktop", - "version": "1.0.3", - "dependencies": { - "e2b": "^1.0.7" - }, - "devDependencies": { - "@types/node": "^22.13.9", - "dotenv": "^16.4.5", - "tsup": "^8.3.5", - "tsx": "^4.19.2", - "typedoc": "^0.27.9", - "typedoc-plugin-markdown": "^4.2.7", - "typescript": "^5.6.3", - "vitest": "^3.0.5" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.3.tgz", - "integrity": "sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==" - }, - "node_modules/@connectrpc/connect": { - "version": "2.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.0.0-rc.3.tgz", - "integrity": "sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==", - "peerDependencies": { - "@bufbuild/protobuf": "^2.2.0" - } - }, - "node_modules/@connectrpc/connect-web": { - "version": "2.0.0-rc.3", - "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-2.0.0-rc.3.tgz", - "integrity": "sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==", - "peerDependencies": { - "@bufbuild/protobuf": "^2.2.0", - "@connectrpc/connect": "2.0.0-rc.3" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@gerrit0/mini-shiki": { - "version": "1.27.2", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-1.27.2.tgz", - "integrity": "sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/engine-oniguruma": "^1.27.2", - "@shikijs/types": "^1.27.2", - "@shikijs/vscode-textmate": "^10.0.1" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.2.tgz", - "integrity": "sha512-6Fyg9yQbwJR+ykVdT9sid1oc2ewejS6h4wzQltmJfSW53N60G/ah9pngXGANdy9/aaE/TcUFpWosdm7JXS1WTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.2.tgz", - "integrity": "sha512-K5GfWe+vtQ3kyEbihrimM38UgX57UqHp+oME7X/EX9Im6suwZfa7Hsr8AtzbJvukTpwMGs+4s29YMSO3rwWtsw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.2.tgz", - "integrity": "sha512-PSN58XG/V/tzqDb9kDGutUruycgylMlUE59f40ny6QIRNsTEIZsrNQTJKUN2keMMSmlzgunMFqyaGLmly39sug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.2.tgz", - "integrity": "sha512-gQhK788rQJm9pzmXyfBB84VHViDERhAhzGafw+E5mUpnGKuxZGkMVDa3wgDFKT6ukLC5V7QTifzsUKdNVxp5qQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.2.tgz", - "integrity": "sha512-eiaHgQwGPpxLC3+zTAcdKl4VsBl3r0AiJOd1Um/ArEzAjN/dbPK1nROHrVkdnoE6p7Svvn04w3f/jEZSTVHunA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.2.tgz", - "integrity": "sha512-lhdiwQ+jf8pewYOTG4bag0Qd68Jn1v2gO1i0mTuiD+Qkt5vNfHVK/jrT7uVvycV8ZchlzXp5HDVmhpzjC6mh0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.2.tgz", - "integrity": "sha512-lfqTpWjSvbgQP1vqGTXdv+/kxIznKXZlI109WkIFPbud41bjigjNmOAAKoazmRGx+k9e3rtIdbq2pQZPV1pMig==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.2.tgz", - "integrity": "sha512-RGjqULqIurqqv+NJTyuPgdZhka8ImMLB32YwUle2BPTDqDoXNgwFjdjQC59FbSk08z0IqlRJjrJ0AvDQ5W5lpw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.2.tgz", - "integrity": "sha512-ZvkPiheyXtXlFqHpsdgscx+tZ7hoR59vOettvArinEspq5fxSDSgfF+L5wqqJ9R4t+n53nyn0sKxeXlik7AY9Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.2.tgz", - "integrity": "sha512-UlFk+E46TZEoxD9ufLKDBzfSG7Ki03fo6hsNRRRHF+KuvNZ5vd1RRVQm8YZlGsjcJG8R252XFK0xNPay+4WV7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.2.tgz", - "integrity": "sha512-hJhfsD9ykx59jZuuoQgYT1GEcNNi3RCoEmbo5OGfG8RlHOiVS7iVNev9rhLKh7UBYq409f4uEw0cclTXx8nh8Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.2.tgz", - "integrity": "sha512-g/O5IpgtrQqPegvqopvmdCF9vneLE7eqYfdPWW8yjPS8f63DNam3U4ARL1PNNB64XHZDHKpvO2Giftf43puB8Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.2.tgz", - "integrity": "sha512-bSQijDC96M6PuooOuXHpvXUYiIwsnDmqGU8+br2U7iPoykNi9JtMUpN7K6xml29e0evK0/g0D1qbAUzWZFHY5Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.2.tgz", - "integrity": "sha512-49TtdeVAsdRuiUHXPrFVucaP4SivazetGUVH8CIxVsNsaPHV4PFkpLmH9LeqU/R4Nbgky9lzX5Xe1NrzLyraVA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.2.tgz", - "integrity": "sha512-j+jFdfOycLIQ7FWKka9Zd3qvsIyugg5LeZuHF6kFlXo6MSOc6R1w37YUVy8VpAKd81LMWGi5g9J25P09M0SSIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.2.tgz", - "integrity": "sha512-aDPHyM/D2SpXfSNCVWCxyHmOqN9qb7SWkY1+vaXqMNMXslZYnwh9V/UCudl6psyG0v6Ukj7pXanIpfZwCOEMUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.2.tgz", - "integrity": "sha512-LQRkCyUBnAo7r8dbEdtNU08EKLCJMgAk2oP5H3R7BnUlKLqgR3dUjrLBVirmc1RK6U6qhtDw29Dimeer8d5hzQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.2.tgz", - "integrity": "sha512-wt8OhpQUi6JuPFkm1wbVi1BByeag87LDFzeKSXzIdGcX4bMLqORTtKxLoCbV57BHYNSUSOKlSL4BYYUghainYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.2.tgz", - "integrity": "sha512-rUrqINax0TvrPBXrFKg0YbQx18NpPN3NNrgmaao9xRNbTwek7lOXObhx8tQy8gelmQ/gLaGy1WptpU2eKJZImg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@shikijs/engine-oniguruma": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz", - "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/types": "1.29.2", - "@shikijs/vscode-textmate": "^10.0.1" - } - }, - "node_modules/@shikijs/types": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz", - "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@shikijs/vscode-textmate": "^10.0.1", - "@types/hast": "^3.0.4" - } - }, - "node_modules/@shikijs/vscode-textmate": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", - "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/node": { - "version": "22.13.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", - "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitest/expect": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", - "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", - "dev": true, - "dependencies": { - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", - "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", - "dev": true, - "dependencies": { - "@vitest/spy": "3.0.5", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", - "dev": true, - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", - "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", - "dev": true, - "dependencies": { - "@vitest/utils": "3.0.5", - "pathe": "^2.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", - "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "3.0.5", - "magic-string": "^0.30.17", - "pathe": "^2.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", - "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", - "dev": true, - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", - "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", - "dev": true, - "dependencies": { - "@vitest/pretty-format": "3.0.5", - "loupe": "^3.1.2", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", - "dev": true, - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "engines": { - "node": ">= 16" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==" - }, - "node_modules/consola": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", - "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", - "dev": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/e2b": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/e2b/-/e2b-1.0.7.tgz", - "integrity": "sha512-7msagBbQ8tm51qaGp+hdaaaMjGG3zCzZtUS8bnz+LK7wdwtVTA1PmX+1Br9E3R7v6XIchnNWRpei+VjvGcfidA==", - "dependencies": { - "@bufbuild/protobuf": "^2.2.2", - "@connectrpc/connect": "2.0.0-rc.3", - "@connectrpc/connect-web": "2.0.0-rc.3", - "compare-versions": "^6.1.0", - "openapi-fetch": "^0.9.7", - "platform": "^1.3.6" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "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" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/loupe": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", - "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/openapi-fetch": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.9.8.tgz", - "integrity": "sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==", - "dependencies": { - "openapi-typescript-helpers": "^0.0.8" - } - }, - "node_modules/openapi-typescript-helpers": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.8.tgz", - "integrity": "sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==" - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", - "dev": true - }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, - "engines": { - "node": ">= 14.16" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" - }, - "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/readdirp": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", - "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", - "dev": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/rollup": { - "version": "4.34.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.2.tgz", - "integrity": "sha512-sBDUoxZEaqLu9QeNalL8v3jw6WjPku4wfZGyTU7l7m1oC+rpRihXc/n/H+4148ZkGz5Xli8CHMns//fFGKvpIQ==", - "dev": true, - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.2", - "@rollup/rollup-android-arm64": "4.34.2", - "@rollup/rollup-darwin-arm64": "4.34.2", - "@rollup/rollup-darwin-x64": "4.34.2", - "@rollup/rollup-freebsd-arm64": "4.34.2", - "@rollup/rollup-freebsd-x64": "4.34.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.2", - "@rollup/rollup-linux-arm-musleabihf": "4.34.2", - "@rollup/rollup-linux-arm64-gnu": "4.34.2", - "@rollup/rollup-linux-arm64-musl": "4.34.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.2", - "@rollup/rollup-linux-riscv64-gnu": "4.34.2", - "@rollup/rollup-linux-s390x-gnu": "4.34.2", - "@rollup/rollup-linux-x64-gnu": "4.34.2", - "@rollup/rollup-linux-x64-musl": "4.34.2", - "@rollup/rollup-win32-arm64-msvc": "4.34.2", - "@rollup/rollup-win32-ia32-msvc": "4.34.2", - "@rollup/rollup-win32-x64-msvc": "4.34.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dev": true, - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/tinypool": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", - "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", - "dev": true, - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsup": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.3.6.tgz", - "integrity": "sha512-XkVtlDV/58S9Ye0JxUUTcrQk4S+EqlOHKzg6Roa62rdjL1nGWNUstG0xgI4vanHdfIpjP448J8vlN0oK6XOJ5g==", - "dev": true, - "dependencies": { - "bundle-require": "^5.0.0", - "cac": "^6.7.14", - "chokidar": "^4.0.1", - "consola": "^3.2.3", - "debug": "^4.3.7", - "esbuild": "^0.24.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.24.0", - "source-map": "0.8.0-beta.0", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.1", - "tinyglobby": "^0.2.9", - "tree-kill": "^1.2.2" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", - "dev": true, - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/typedoc": { - "version": "0.27.9", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.27.9.tgz", - "integrity": "sha512-/z585740YHURLl9DN2jCWe6OW7zKYm6VoQ93H0sxZ1cwHQEQrUn5BJrEnkWhfzUdyO+BLGjnKUZ9iz9hKloFDw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@gerrit0/mini-shiki": "^1.24.0", - "lunr": "^2.3.9", - "markdown-it": "^14.1.0", - "minimatch": "^9.0.5", - "yaml": "^2.6.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 18" - }, - "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 || 5.8.x" - } - }, - "node_modules/typedoc-plugin-markdown": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.4.1.tgz", - "integrity": "sha512-fx23nSCvewI9IR8lzIYtzDphETcgTDuxKcmHKGD4lo36oexC+B1k4NaCOY58Snqb4OlE8OXDAGVcQXYYuLRCNw==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "typedoc": "0.27.x" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", - "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.0.tgz", - "integrity": "sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.1", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "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 - } - } - }, - "node_modules/vite-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", - "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.2", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", - "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", - "dev": true, - "dependencies": { - "@vitest/expect": "3.0.5", - "@vitest/mocker": "3.0.5", - "@vitest/pretty-format": "^3.0.5", - "@vitest/runner": "3.0.5", - "@vitest/snapshot": "3.0.5", - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "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": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.5", - "@vitest/ui": "3.0.5", - "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 - } - } - }, - "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/packages/js-sdk/package.json b/packages/js-sdk/package.json index ce9a734..d8d9a23 100644 --- a/packages/js-sdk/package.json +++ b/packages/js-sdk/package.json @@ -1,6 +1,7 @@ { "name": "@e2b/desktop", - "version": "1.6.2", + "version": "2.2.2", + "license": "MIT", "description": "E2B Desktop Sandbox - isolated cloud environment with a desktop-like interface powered by E2B. Ready for AI Computer Use", "author": { "name": "FoundryLabs, Inc.", @@ -33,7 +34,7 @@ "package.json" ], "engines": { - "node": ">=18" + "node": ">=20" }, "browserslist": [ "defaults" @@ -48,19 +49,18 @@ "dev": "tsup --watch", "test": "vitest run --disable-console-intercept", "example": "npx tsx example.mts", - "generate-ref": "./scripts/generate_sdk_ref.sh" + "lint": "eslint src/ tests/", + "format": "prettier --write src/ tests/ example.mts" }, "devDependencies": { "@types/node": "^22.13.9", "dotenv": "^16.4.5", "tsup": "^8.3.5", "tsx": "^4.19.2", - "typedoc": "0.26.8", - "typedoc-plugin-markdown": "4.2.7", "typescript": "^5.6.3", "vitest": "^3.0.5" }, "dependencies": { - "e2b": "^1.0.7" + "e2b": "^2.8.4" } } diff --git a/packages/js-sdk/scripts/CustomMarkdownTheme.js b/packages/js-sdk/scripts/CustomMarkdownTheme.js deleted file mode 100644 index ba0f43d..0000000 --- a/packages/js-sdk/scripts/CustomMarkdownTheme.js +++ /dev/null @@ -1,64 +0,0 @@ -const { MarkdownPageEvent } = require("typedoc-plugin-markdown"); - -function load(app) { - // Listen to the render event - app.renderer.on(MarkdownPageEvent.END, (page) => { - // Remove Markdown links from the document contents - page.contents = removeMarkdownLinks( - removeFirstNLines( - convertH5toH3(removeLinesWithConditions(page.contents)), - 6 - ) - ); - }); -} - -// this is a hacky way to make methods in the js-sdk sdk reference look more prominent -function convertH5toH3(text) { - return text.replace(/^##### (.*)$/gm, "### $1"); -} - -// Function to remove Markdown-style links -function removeMarkdownLinks(text) { - // Regular expression to match Markdown links [text](url) - return text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, "$1"); // Replace with just the link text -} - -function removeFirstNLines(text, n, condition) { - // Split the text into lines, then join back excluding the first four lines - return text.split("\n").slice(n).join("\n"); -} - -// Function to remove lines based on conditions -function removeLinesWithConditions(text) { - const lines = text.split("\n"); - const filteredLines = []; - - for (let i = 0; i < lines.length; i++) { - // Check if the current line starts with "#### Extends" or "###### Overrides" - if ( - lines[i].startsWith("#### Extends") || - lines[i].startsWith("###### Overrides") || - lines[i].startsWith("###### Inherited from") - ) { - // If it does, skip this line and the next three lines - i += 3; // Skip this line and the next three - continue; - } - - if (lines[i].startsWith("##### new")) { - // avoid promoting constructors - i += 1; - continue; - } - - // If not removed, add the line to filteredLines - filteredLines.push(convertH5toH3(lines[i])); - } - - // Join the filtered lines back into a single string - return filteredLines.join("\n"); -} - -// Export the load function -module.exports = { load }; diff --git a/packages/js-sdk/scripts/generate_sdk_ref.sh b/packages/js-sdk/scripts/generate_sdk_ref.sh deleted file mode 100755 index 3862cb0..0000000 --- a/packages/js-sdk/scripts/generate_sdk_ref.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the Desktop JS SDK reference markdown files -# Run it in the `js-sdk/` directory - -# generate raw SDK reference markdown files -npx typedoc - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../../sdk-reference/desktop-js-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -rm -rf sdk_ref/README.md - -# Flatten the sdk_ref directory by moving all nested files to the root level and remove empty subdirectories -find sdk_ref -mindepth 2 -type f | while read -r file; do - mv "$file" sdk_ref/ -done -find sdk_ref -type d -empty -delete - -rm sdk_ref/index.md - -# Transfrom top level MD files into folders of the same name with page.mdx inside -find sdk_ref -maxdepth 1 -type f -name "*.md" | while read -r file; do - # Extract the filename without extension - filename=$(basename "$file" .md) - # Create the directory of the same name in sdk_ref - mkdir -p "sdk_ref/${filename}" - # Move the file inside the newly created directory - mv "$file" "sdk_ref/${filename}/page.mdx" -done - -cp -r sdk_ref/* "${ROUTES_DIR}" - -rm -rf sdk_ref diff --git a/packages/js-sdk/src/index.ts b/packages/js-sdk/src/index.ts index db5fbb6..3e072a9 100644 --- a/packages/js-sdk/src/index.ts +++ b/packages/js-sdk/src/index.ts @@ -1,3 +1,3 @@ export * from 'e2b' -export { Sandbox } from './sandbox' \ No newline at end of file +export { Sandbox } from './sandbox' diff --git a/packages/js-sdk/src/sandbox.ts b/packages/js-sdk/src/sandbox.ts index eb4eeb6..8ed85e9 100644 --- a/packages/js-sdk/src/sandbox.ts +++ b/packages/js-sdk/src/sandbox.ts @@ -1,79 +1,86 @@ -import { Sandbox as SandboxBase, SandboxOpts as SandboxOptsBase, CommandHandle, CommandResult, CommandExitError, ConnectionConfig, TimeoutError } from 'e2b' +import { + Sandbox as SandboxBase, + SandboxOpts as SandboxOptsBase, + SandboxBetaCreateOpts as SandboxBetaCreateOptsBase, + CommandHandle, + CommandResult, + CommandExitError, + TimeoutError, +} from 'e2b' import { generateRandomString } from './utils' - interface CursorPosition { - x: number; - y: number; + x: number + y: number } interface ScreenSize { - width: number; - height: number; + width: number + height: number } const MOUSE_BUTTONS = { left: 1, right: 3, - middle: 2 + middle: 2, } const KEYS = { - "alt": "Alt_L", - "alt_left": "Alt_L", - "alt_right": "Alt_R", - "backspace": "BackSpace", - "break": "Pause", - "caps_lock": "Caps_Lock", - "cmd": "Super_L", - "command": "Super_L", - "control": "Control_L", - "control_left": "Control_L", - "control_right": "Control_R", - "ctrl": "Control_L", - "del": "Delete", - "delete": "Delete", - "down": "Down", - "end": "End", - "enter": "Return", - "esc": "Escape", - "escape": "Escape", - "f1": "F1", - "f2": "F2", - "f3": "F3", - "f4": "F4", - "f5": "F5", - "f6": "F6", - "f7": "F7", - "f8": "F8", - "f9": "F9", - "f10": "F10", - "f11": "F11", - "f12": "F12", - "home": "Home", - "insert": "Insert", - "left": "Left", - "menu": "Menu", - "meta": "Meta_L", - "num_lock": "Num_Lock", - "page_down": "Page_Down", - "page_up": "Page_Up", - "pause": "Pause", - "print": "Print", - "right": "Right", - "scroll_lock": "Scroll_Lock", - "shift": "Shift_L", - "shift_left": "Shift_L", - "shift_right": "Shift_R", - "space": "space", - "super": "Super_L", - "super_left": "Super_L", - "super_right": "Super_R", - "tab": "Tab", - "up": "Up", - "win": "Super_L", - "windows": "Super_L" + alt: 'Alt_L', + alt_left: 'Alt_L', + alt_right: 'Alt_R', + backspace: 'BackSpace', + break: 'Pause', + caps_lock: 'Caps_Lock', + cmd: 'Super_L', + command: 'Super_L', + control: 'Control_L', + control_left: 'Control_L', + control_right: 'Control_R', + ctrl: 'Control_L', + del: 'Delete', + delete: 'Delete', + down: 'Down', + end: 'End', + enter: 'Return', + esc: 'Escape', + escape: 'Escape', + f1: 'F1', + f2: 'F2', + f3: 'F3', + f4: 'F4', + f5: 'F5', + f6: 'F6', + f7: 'F7', + f8: 'F8', + f9: 'F9', + f10: 'F10', + f11: 'F11', + f12: 'F12', + home: 'Home', + insert: 'Insert', + left: 'Left', + menu: 'Menu', + meta: 'Meta_L', + num_lock: 'Num_Lock', + page_down: 'Page_Down', + page_up: 'Page_Up', + pause: 'Pause', + print: 'Print', + right: 'Right', + scroll_lock: 'Scroll_Lock', + shift: 'Shift_L', + shift_left: 'Shift_L', + shift_right: 'Shift_R', + space: 'space', + super: 'Super_L', + super_left: 'Super_L', + super_right: 'Super_R', + tab: 'Tab', + up: 'Up', + win: 'Super_L', + windows: 'Super_L', } function mapKey(key: string): string { @@ -109,16 +116,36 @@ export interface SandboxOpts extends SandboxOptsBase { display?: string } +/** + * Configuration options for the Sandbox environment. + * @interface SandboxOpts + * @extends {SandboxOptsBase} + */ +export interface SandboxBetaCreateOpts extends SandboxBetaCreateOptsBase { + /** + * The screen resolution in pixels, specified as [width, height]. + * @type {[number, number]} + */ + resolution?: [number, number] + + /** + * Dots per inch (DPI) setting for the display. + * @type {number} + */ + dpi?: number + + /** + * Display identifier. + * @type {string} + */ + display?: string +} export class Sandbox extends SandboxBase { protected static override readonly defaultTemplate: string = 'desktop' - private lastXfce4Pid: number | null = null; - readonly display: string; - readonly stream: VNCServer; - private readonly changeWallpaperCmd: string = ( - `xfconf-query --create -t string -c xfce4-desktop -p ` + - `/backdrop/screen0/monitorscreen/workspace0/last-image -s /usr/share/backgrounds/xfce/wallpaper.png` - ) + public display: string = ':0' + public stream: VNCServer = new VNCServer(this) + private lastXfce4Pid: number | null = null /** * Use {@link Sandbox.create} to create a new Sandbox instead. @@ -128,15 +155,15 @@ export class Sandbox extends SandboxBase { * @internal * @access protected */ - constructor(opts: Omit & { - sandboxId: string; - envdVersion?: string; - }) { - super(opts); - this.display = opts.display || ':0'; - this.lastXfce4Pid = null; - this.stream = new VNCServer(this); + constructor( + opts: Omit & { + sandboxId: string + envdVersion: string + } + ) { + super(opts) } + /** * Create a new sandbox from the default `desktop` sandbox template. * @@ -183,35 +210,86 @@ export class Sandbox extends SandboxBase { ? { template: templateOrOpts, sandboxOpts: opts } : { template: this.defaultTemplate, sandboxOpts: templateOrOpts } - const config = new ConnectionConfig(sandboxOpts) - - let sbx - if (config.debug) { - sbx = new this({ sandboxId: 'desktop', ...sandboxOpts, ...config }) as InstanceType - } else { - const sandbox = await this.createSandbox( - template, - sandboxOpts?.timeoutMs ?? this.defaultSandboxTimeoutMs, - sandboxOpts - ) - sbx = new this({ ...sandbox, ...sandboxOpts, ...config }) as InstanceType + // Add DISPLAY environment variable if not already set + const display = opts?.display || ':0' + const sandboxOptsWithDisplay = { + ...sandboxOpts, + envs: { + ...sandboxOpts?.envs, + DISPLAY: display, + }, } - const [width, height] = sandboxOpts?.resolution ?? [1024, 768] - await sbx.commands.run( - `Xvfb ${sbx.display} -ac -screen 0 ${width}x${height}x24 ` + - `-retro -dpi ${sandboxOpts?.dpi ?? 96} -nolisten tcp -nolisten unix`, - { background: true } - ) + const sbx = (await super.create( + template, + sandboxOptsWithDisplay + )) as InstanceType + await sbx._start(display, sandboxOptsWithDisplay) - let hasStarted = await sbx.waitAndVerify( - `xdpyinfo -display ${sbx.display}`, (r: CommandResult) => r.exitCode === 0 - ) - if (!hasStarted) { - throw new TimeoutError("Could not start Xvfb") + return sbx + } + + /** + * Create a new sandbox from the default `desktop` sandbox template. + * + * @param opts connection options. + * + * @returns sandbox instance for the new sandbox. + * + * @example + * ```ts + * const sandbox = await Sandbox.create() + * ``` + * @constructs Sandbox + */ + static async betaCreate( + this: S, + opts?: SandboxBetaCreateOpts + ): Promise> + /** + * Create a new sandbox from the specified sandbox template. + * + * @param template sandbox template name or ID. + * @param opts connection options. + * + * @returns sandbox instance for the new sandbox. + * + * @example + * ```ts + * const sandbox = await Sandbox.create('') + * ``` + * @constructs Sandbox + */ + static async betaCreate( + this: S, + template: string, + opts?: SandboxBetaCreateOpts + ): Promise> + static async betaCreate( + this: S, + templateOrOpts?: SandboxBetaCreateOpts | string, + opts?: SandboxOpts + ): Promise> { + const { template, sandboxOpts } = + typeof templateOrOpts === 'string' + ? { template: templateOrOpts, sandboxOpts: opts } + : { template: this.defaultTemplate, sandboxOpts: templateOrOpts } + + // Add DISPLAY environment variable if not already set + const display = opts?.display || ':0' + const sandboxOptsWithDisplay = { + ...sandboxOpts, + envs: { + ...sandboxOpts?.envs, + DISPLAY: display, + }, } - await sbx.startXfce4() + const sbx = (await super.betaCreate( + template, + sandboxOptsWithDisplay + )) as InstanceType + await sbx._start(display, sandboxOptsWithDisplay) return sbx } @@ -230,42 +308,25 @@ export class Sandbox extends SandboxBase { timeout: number = 10, interval: number = 0.5 ): Promise { - let elapsed = 0; + let elapsed = 0 while (elapsed < timeout) { try { if (onResult(await this.commands.run(cmd))) { - return true; + return true } } catch (e) { if (e instanceof CommandExitError) { - continue; + continue } - throw e; + throw e } - await new Promise(resolve => setTimeout(resolve, interval * 1000)); - elapsed += interval; + await new Promise((resolve) => setTimeout(resolve, interval * 1000)) + elapsed += interval } - return false; - } - - /** - * Start xfce4 session if logged out or not running. - */ - private async startXfce4(): Promise { - if (this.lastXfce4Pid === null || ( - await this.commands.run( - `ps aux | grep ${this.lastXfce4Pid} | grep -v grep | head -n 1` - )).stdout.trim().includes("[xfce4-session] ") - ) { - const result = await this.commands.run( - "startxfce4", { envs: { DISPLAY: this.display }, background: true } - ); - this.lastXfce4Pid = result.pid; - await this.commands.run(this.changeWallpaperCmd, { envs: { DISPLAY: this.display } }); - } + return false } /** @@ -292,7 +353,7 @@ export class Sandbox extends SandboxBase { async screenshot(format: 'stream'): Promise> async screenshot(format: 'bytes' | 'blob' | 'stream' = 'bytes') { const path = `/tmp/screenshot-${generateRandomString()}.png` - await this.commands.run(`scrot --pointer ${path}`, { envs: { DISPLAY: this.display } }) + await this.commands.run(`scrot --pointer ${path}`) // @ts-expect-error const file = await this.files.read(path, { format }) @@ -305,10 +366,10 @@ export class Sandbox extends SandboxBase { */ async leftClick(x?: number, y?: number): Promise { if (x && y) { - await this.moveMouse(x, y); + await this.moveMouse(x, y) } - await this.commands.run("xdotool click 1", { envs: { DISPLAY: this.display } }); + await this.commands.run('xdotool click 1') } /** @@ -316,10 +377,10 @@ export class Sandbox extends SandboxBase { */ async doubleClick(x?: number, y?: number): Promise { if (x && y) { - await this.moveMouse(x, y); + await this.moveMouse(x, y) } - await this.commands.run("xdotool click --repeat 2 1", { envs: { DISPLAY: this.display } }); + await this.commands.run('xdotool click --repeat 2 1') } /** @@ -327,10 +388,10 @@ export class Sandbox extends SandboxBase { */ async rightClick(x?: number, y?: number): Promise { if (x && y) { - await this.moveMouse(x, y); + await this.moveMouse(x, y) } - await this.commands.run("xdotool click 3", { envs: { DISPLAY: this.display } }); + await this.commands.run('xdotool click 3') } /** @@ -338,10 +399,10 @@ export class Sandbox extends SandboxBase { */ async middleClick(x?: number, y?: number): Promise { if (x && y) { - await this.moveMouse(x, y); + await this.moveMouse(x, y) } - await this.commands.run("xdotool click 2", { envs: { DISPLAY: this.display } }); + await this.commands.run('xdotool click 2') } /** @@ -349,11 +410,12 @@ export class Sandbox extends SandboxBase { * @param direction - The direction to scroll. Can be "up" or "down". * @param amount - The amount to scroll. */ - async scroll(direction: 'up' | 'down' = 'down', amount: number = 1): Promise { - const button = direction === 'up' ? '4' : '5'; - await this.commands.run( - `xdotool click --repeat ${amount} ${button}`, { envs: { DISPLAY: this.display } } - ); + async scroll( + direction: 'up' | 'down' = 'down', + amount: number = 1 + ): Promise { + const button = direction === 'up' ? '4' : '5' + await this.commands.run(`xdotool click --repeat ${amount} ${button}`) } /** @@ -362,23 +424,25 @@ export class Sandbox extends SandboxBase { * @param y - The y coordinate. */ async moveMouse(x: number, y: number): Promise { - await this.commands.run( - `xdotool mousemove --sync ${x} ${y}`, { envs: { DISPLAY: this.display } } - ); + await this.commands.run(`xdotool mousemove --sync ${x} ${y}`) } /** * Press the mouse button. */ - async mousePress(button: 'left' | 'right' | 'middle' = 'left'): Promise { - await this.commands.run(`xdotool mousedown ${MOUSE_BUTTONS[button]}`, { envs: { DISPLAY: this.display } }); + async mousePress( + button: 'left' | 'right' | 'middle' = 'left' + ): Promise { + await this.commands.run(`xdotool mousedown ${MOUSE_BUTTONS[button]}`) } /** * Release the mouse button. */ - async mouseRelease(button: 'left' | 'right' | 'middle' = 'left'): Promise { - await this.commands.run(`xdotool mouseup ${MOUSE_BUTTONS[button]}`, { envs: { DISPLAY: this.display } }); + async mouseRelease( + button: 'left' | 'right' | 'middle' = 'left' + ): Promise { + await this.commands.run(`xdotool mouseup ${MOUSE_BUTTONS[button]}`) } /** @@ -387,23 +451,21 @@ export class Sandbox extends SandboxBase { * @throws Error if cursor position cannot be determined */ async getCursorPosition(): Promise { - const result = await this.commands.run( - "xdotool getmouselocation", { envs: { DISPLAY: this.display } } - ); + const result = await this.commands.run('xdotool getmouselocation') - const match = result.stdout.match(/x:(\d+)\s+y:(\d+)/); + const match = result.stdout.match(/x:(\d+)\s+y:(\d+)/) if (!match) { throw new Error( `Failed to parse cursor position from output: ${result.stdout}` - ); + ) } - const [, x, y] = match; + const [, x, y] = match if (!x || !y) { - throw new Error(`Invalid cursor position values: x=${x}, y=${y}`); + throw new Error(`Invalid cursor position values: x=${x}, y=${y}`) } - return { x: parseInt(x), y: parseInt(y) }; + return { x: parseInt(x), y: parseInt(y) } } /** @@ -412,45 +474,23 @@ export class Sandbox extends SandboxBase { * @throws Error if screen size cannot be determined */ async getScreenSize(): Promise { - const result = await this.commands.run( - "xrandr", { envs: { DISPLAY: this.display } } - ); + const result = await this.commands.run('xrandr') - const match = result.stdout.match(/(\d+x\d+)/); + const match = result.stdout.match(/(\d+x\d+)/) if (!match) { throw new Error( `Failed to parse screen size from output: ${result.stdout}` - ); + ) } try { - const [width, height] = match[1].split("x").map(val => parseInt(val)); - return { width, height }; + const [width, height] = match[1].split('x').map((val) => parseInt(val)) + return { width, height } } catch (error) { - throw new Error(`Invalid screen size format: ${match[1]}`); + throw new Error(`Invalid screen size format: ${match[1]}`) } } - private *breakIntoChunks(text: string, n: number): Generator { - for (let i = 0; i < text.length; i += n) { - yield text.slice(i, i + n); - } - } - - private quoteString(s: string): string { - if (!s) { - return "''"; - } - - if (!/[^\w@%+=:,./-]/.test(s)) { - return s; - } - - // use single quotes, and put single quotes into double quotes - // the string $'b is then quoted as '$'"'"'b' - return "'" + s.replace(/'/g, "'\"'\"'") + "'"; - } - /** * Write the given text at the current cursor position. * @param text - The text to write. @@ -460,15 +500,19 @@ export class Sandbox extends SandboxBase { */ async write( text: string, - options: { chunkSize: number, delayInMs: number } = { chunkSize: 25, delayInMs: 75 } + options: { chunkSize: number; delayInMs: number } = { + chunkSize: 25, + delayInMs: 75, + } ): Promise { - const chunks = this.breakIntoChunks(text, options.chunkSize); + const chunks = this.breakIntoChunks(text, options.chunkSize) for (const chunk of chunks) { await this.commands.run( - `xdotool type --delay ${options.delayInMs} ${this.quoteString(chunk)}`, - { envs: { DISPLAY: this.display } } - ); + `xdotool type --delay ${options.delayInMs} -- ${this.quoteString( + chunk + )}` + ) } } @@ -483,9 +527,7 @@ export class Sandbox extends SandboxBase { key = mapKey(key) } - await this.commands.run( - `xdotool key ${key}`, { envs: { DISPLAY: this.display } } - ); + await this.commands.run(`xdotool key ${key}`) } /** @@ -493,11 +535,14 @@ export class Sandbox extends SandboxBase { * @param from - The starting position. * @param to - The ending position. */ - async drag([x1, y1]: [number, number], [x2, y2]: [number, number]): Promise { - await this.moveMouse(x1, y1); - await this.mousePress(); - await this.moveMouse(x2, y2); - await this.mouseRelease(); + async drag( + [x1, y1]: [number, number], + [x2, y2]: [number, number] + ): Promise { + await this.moveMouse(x1, y1) + await this.mousePress() + await this.moveMouse(x2, y2) + await this.mouseRelease() } /** @@ -505,7 +550,7 @@ export class Sandbox extends SandboxBase { * @param ms - The amount of time to wait in milliseconds. */ async wait(ms: number): Promise { - await this.commands.run(`sleep ${ms / 1000}`, { envs: { DISPLAY: this.display } }); + await this.commands.run(`sleep ${ms / 1000}`) } /** @@ -513,87 +558,194 @@ export class Sandbox extends SandboxBase { * @param fileOrUrl - The file or URL to open. */ async open(fileOrUrl: string): Promise { + await this.commands.run(`xdg-open ${fileOrUrl}`, { + background: true, + }) + } + + /** + * Get the current window ID. + * @returns The ID of the current window. + */ + async getCurrentWindowId(): Promise { + const result = await this.commands.run('xdotool getwindowfocus') + return result.stdout.trim() + } + + /** + * Get the window ID of the window with the given title. + * @param title - The title of the window. + * @returns The ID of the window. + */ + async getApplicationWindows(application: string): Promise { + const result = await this.commands.run( + `xdotool search --onlyvisible --class ${application}` + ) + + return result.stdout.trim().split('\n') + } + + /** + * Get the title of the window with the given ID. + * @param windowId - The ID of the window. + * @returns The title of the window. + */ + async getWindowTitle(windowId: string): Promise { + const result = await this.commands.run(`xdotool getwindowname ${windowId}`) + + return result.stdout.trim() + } + + /** + * Launch an application. + * @param application - The application to launch. + * @param uri - The URI to open in the application. + */ + async launch(application: string, uri?: string): Promise { + await this.commands.run(`gtk-launch ${application} ${uri ?? ''}`, { + background: true, + timeoutMs: 0, + }) + } + + protected async _start(display: string, opts?: SandboxOpts): Promise { + this.display = display + this.lastXfce4Pid = null + this.stream = new VNCServer(this) + + const [width, height] = opts?.resolution ?? [1024, 768] await this.commands.run( - `xdg-open ${fileOrUrl}`, { background: true, envs: { DISPLAY: this.display } } - ); + `Xvfb ${display} -ac -screen 0 ${width}x${height}x24 ` + + `-retro -dpi ${opts?.dpi ?? 96} -nolisten tcp -nolisten unix`, + { background: true, timeoutMs: 0 } + ) + + const hasStarted = await this.waitAndVerify( + `xdpyinfo -display ${display}`, + (r: CommandResult) => r.exitCode === 0 + ) + if (!hasStarted) { + throw new TimeoutError('Could not start Xvfb') + } + + await this.startXfce4() + } + + /** + * Start xfce4 session if logged out or not running. + */ + private async startXfce4(): Promise { + if ( + this.lastXfce4Pid === null || + ( + await this.commands.run( + `ps aux | grep ${this.lastXfce4Pid} | grep -v grep | head -n 1` + ) + ).stdout + .trim() + .includes('[xfce4-session] ') + ) { + const result = await this.commands.run('startxfce4', { + background: true, + timeoutMs: 0, + }) + this.lastXfce4Pid = result.pid + } + } + + private *breakIntoChunks(text: string, n: number): Generator { + for (let i = 0; i < text.length; i += n) { + yield text.slice(i, i + n) + } + } + + private quoteString(s: string): string { + if (!s) { + return "''" + } + + if (!/[^\w@%+=:,./-]/.test(s)) { + return s + } + + // use single quotes, and put single quotes into double quotes + // the string $'b is then quoted as '$'"'"'b' + return "'" + s.replace(/'/g, "'\"'\"'") + "'" } } interface VNCServerOptions { - vncPort?: number; - port?: number; - requireAuth?: boolean; + vncPort?: number + port?: number + requireAuth?: boolean + windowId?: string +} + +interface UrlOptions { + autoConnect?: boolean + viewOnly?: boolean + resize?: 'off' | 'scale' | 'remote' + authKey?: string } // Modified VNCServer class class VNCServer { - private vncPort: number = 5900; - private port: number = 6080; - private novncAuthEnabled: boolean = false; - private url: URL | null = null; - private vncHandle: CommandHandle | null = null; - private novncHandle: CommandHandle | null = null; - private password: string | undefined; - private vncCommand: string = ""; - private readonly novncCommand: string; - private readonly desktop: Sandbox; + private vncPort: number = 5900 + private port: number = 6080 + private novncAuthEnabled: boolean = false + private url: URL | null = null + private novncHandle: CommandHandle | null = null + private password: string | undefined + private readonly novncCommand: string + private readonly desktop: Sandbox constructor(desktop: Sandbox) { - this.desktop = desktop; - this.novncCommand = ( + this.desktop = desktop + this.novncCommand = `cd /opt/noVNC/utils && ./novnc_proxy --vnc localhost:${this.vncPort} ` + `--listen ${this.port} --web /opt/noVNC > /tmp/novnc.log 2>&1` - ); } public getAuthKey(): string { if (!this.password) { - throw new Error('Unable to retrieve stream auth key, check if requireAuth is enabled'); - } - - return this.password; - } - - /** - * Set the VNC command to start the VNC server. - */ - private async setVncCommand(): Promise { - let pwdFlag = "-nopw"; - if (this.novncAuthEnabled) { - await this.desktop.commands.run("mkdir ~/.vnc"); - await this.desktop.commands.run(`x11vnc -storepasswd ${this.password} ~/.vnc/passwd`); - pwdFlag = "-usepw"; + throw new Error( + 'Unable to retrieve stream auth key, check if requireAuth is enabled' + ) } - this.vncCommand = ( - `x11vnc -display ${this.desktop.display} -forever -wait 50 -shared ` + - `-rfbport ${this.vncPort} ${pwdFlag} 2>/tmp/x11vnc_stderr.log` - ); - } - - private async waitForPort(port: number): Promise { - return await this.desktop.waitAndVerify( - `netstat -tuln | grep ":${port} "`, (r: CommandResult) => r.stdout.trim() !== "" - ); + return this.password } /** - * Get the URL to connect to the VNC server. + * Get the URL to a web page with a stream of the desktop sandbox. * @param autoConnect - Whether to automatically connect to the server after opening the URL. + * @param viewOnly - Whether to prevent user interaction through the client. + * @param resize - Whether to resize the view when the window resizes. * @param authKey - The password to use to connect to the server. * @returns The URL to connect to the VNC server. */ - public getUrl({ autoConnect = true, authKey }: { autoConnect?: boolean, authKey?: string } = {}): string { + public getUrl({ + autoConnect = true, + viewOnly = false, + resize = 'scale', + authKey, + }: UrlOptions = {}): string { if (this.url === null) { - throw new Error('Server is not running'); + throw new Error('Server is not running') } - let url = new URL(this.url); + const url = new URL(this.url) if (autoConnect) { - url.searchParams.set('autoconnect', 'true'); + url.searchParams.set('autoconnect', 'true') + } + if (viewOnly) { + url.searchParams.set('view_only', 'true') + } + if (resize) { + url.searchParams.set('resize', resize) } if (authKey) { - url.searchParams.set("password", authKey); + url.searchParams.set('password', authKey) } return url.toString() } @@ -602,31 +754,26 @@ class VNCServer { * Start the VNC server. */ public async start(opts: VNCServerOptions = {}): Promise { - // If both servers are already running, throw an error. - if (this.vncHandle !== null && this.novncHandle !== null) { - throw new Error('Server is already running'); - } - - this.vncPort = opts.vncPort ?? this.vncPort; - this.port = opts.port ?? this.port; - this.novncAuthEnabled = opts.requireAuth ?? this.novncAuthEnabled; - this.password = this.novncAuthEnabled ? generateRandomString() : undefined; - this.url = new URL(`https://${this.desktop.getHost(this.port)}/vnc.html`); - - // Stop both servers in case one of them is running. - await this.stop(); - - if (this.vncCommand === "") { - await this.setVncCommand(); - } - this.vncHandle = await this.desktop.commands.run(this.vncCommand, { background: true }); - if (!await this.waitForPort(this.vncPort)) { - throw new Error("Could not start VNC server"); + // If stream is already running, throw an error. + if (await this.checkVNCRunning()) { + throw new Error('Stream is already running') } - this.novncHandle = await this.desktop.commands.run(this.novncCommand, { background: true }); - if (!await this.waitForPort(this.port)) { - throw new Error("Could not start noVNC server"); + this.vncPort = opts.vncPort ?? this.vncPort + this.port = opts.port ?? this.port + this.novncAuthEnabled = opts.requireAuth ?? this.novncAuthEnabled + this.password = this.novncAuthEnabled ? generateRandomString() : undefined + this.url = new URL(`https://${this.desktop.getHost(this.port)}/vnc.html`) + + const vncCommand = await this.getVNCCommand(opts.windowId) + await this.desktop.commands.run(vncCommand) + + this.novncHandle = await this.desktop.commands.run(this.novncCommand, { + background: true, + timeoutMs: 0, + }) + if (!(await this.waitForPort(this.port))) { + throw new Error('Could not start noVNC server') } } @@ -634,14 +781,54 @@ class VNCServer { * Stop the VNC server. */ public async stop(): Promise { - if (this.vncHandle) { - await this.vncHandle.kill(); - this.vncHandle = null; + if (await this.checkVNCRunning()) { + await this.desktop.commands.run('pkill x11vnc') } if (this.novncHandle) { - await this.novncHandle.kill(); - this.novncHandle = null; + await this.novncHandle.kill() + this.novncHandle = null + } + } + + /** + * Set the VNC command to start the VNC server. + */ + private async getVNCCommand(windowId?: string): Promise { + let pwdFlag = '-nopw' + if (this.novncAuthEnabled) { + // Create .vnc directory if it doesn't exist + await this.desktop.commands.run('mkdir -p ~/.vnc') + await this.desktop.commands.run( + `x11vnc -storepasswd ${this.password} ~/.vnc/passwd` + ) + pwdFlag = '-usepw' + } + + return ( + `x11vnc -bg -display ${this.desktop.display} -forever -wait 50 -shared ` + + `-rfbport ${this.vncPort} ${pwdFlag} 2>/tmp/x11vnc_stderr.log` + + (windowId ? ` -id ${windowId}` : '') + ) + } + + private async waitForPort(port: number): Promise { + return await this.desktop.waitAndVerify( + `netstat -tuln | grep ":${port} "`, + (r: CommandResult) => r.stdout.trim() !== '' + ) + } + + /** + * Check if the VNC server is running. + * @returns Whether the VNC server is running. + */ + private async checkVNCRunning(): Promise { + try { + const result = await this.desktop.commands.run('pgrep -x x11vnc') + return result.stdout.trim() !== '' + } catch (error) { + return false } } } diff --git a/packages/js-sdk/src/utils.ts b/packages/js-sdk/src/utils.ts index bfc74fb..4accea4 100644 --- a/packages/js-sdk/src/utils.ts +++ b/packages/js-sdk/src/utils.ts @@ -1,13 +1,14 @@ -import { randomBytes } from 'crypto'; +import { randomBytes } from 'crypto' export function generateRandomString(length: number = 16): string { - const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; - const bytes = randomBytes(length); - let result = ''; + const characters = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + const bytes = randomBytes(length) + let result = '' - for (let i = 0; i < length; i++) { - result += characters[bytes[i] % characters.length]; - } + for (let i = 0; i < length; i++) { + result += characters[bytes[i] % characters.length] + } - return result; -} \ No newline at end of file + return result +} diff --git a/packages/js-sdk/tests/apps.test.ts b/packages/js-sdk/tests/apps.test.ts index bb99f97..a13877d 100644 --- a/packages/js-sdk/tests/apps.test.ts +++ b/packages/js-sdk/tests/apps.test.ts @@ -1,7 +1,5 @@ -import { expect } from 'vitest' import { sandboxTest } from './setup' - sandboxTest('open with default app', async ({ sandbox }) => { // TODO: Implement diff --git a/packages/js-sdk/tests/mouse.test.ts b/packages/js-sdk/tests/mouse.test.ts index 8782888..eb60584 100644 --- a/packages/js-sdk/tests/mouse.test.ts +++ b/packages/js-sdk/tests/mouse.test.ts @@ -1,39 +1,40 @@ -import { expect } from "vitest"; -import { sandboxTest } from "./setup"; +import { expect } from 'vitest' +import { sandboxTest, wait } from './setup' -sandboxTest("cursor position", async ({ sandbox }) => { - const pos = await sandbox.getCursorPosition(); - const size = await sandbox.getScreenSize(); +sandboxTest('cursor position', async ({ sandbox }) => { + const pos = await sandbox.getCursorPosition() + const size = await sandbox.getScreenSize() if (size) { // By the default, the cursor's position is in the center of the screen - expect(pos).toEqual({ x: size.width / 2, y: size.height / 2 }); + expect(pos).toEqual({ x: size.width / 2, y: size.height / 2 }) } else { - throw new Error("Screen size is null"); + throw new Error('Screen size is null') } -}); +}) -sandboxTest("mouse move", async ({ sandbox }) => { - await sandbox.moveMouse(100, 200); - const pos2 = await sandbox.getCursorPosition(); - expect(pos2).toEqual({ x: 100, y: 200 }); -}); - -sandboxTest("mouse left click", async ({ sandbox }) => { - // TODO: Implement -}); - -sandboxTest("mouse double click", async ({ sandbox }) => { - // TODO: Implement -}); - -sandboxTest("mouse right click", async ({ sandbox }) => { - // TODO: Implement -}); - -sandboxTest("mouse middle click", async ({ sandbox }) => { - // TODO: Implement -}); - -sandboxTest("mouse scroll", async ({ sandbox }) => { - // TODO: Implement -}); +sandboxTest('mouse move', async ({ sandbox }) => { + await wait(5_000) + await sandbox.moveMouse(100, 200) + const pos2 = await sandbox.getCursorPosition() + expect(pos2).toEqual({ x: 100, y: 200 }) +}) +// +// sandboxTest('mouse left click', async ({ sandbox }) => { +// // TODO: Implement +// }) +// +// sandboxTest('mouse double click', async ({ sandbox }) => { +// // TODO: Implement +// }) +// +// sandboxTest('mouse right click', async ({ sandbox }) => { +// // TODO: Implement +// }) +// +// sandboxTest('mouse middle click', async ({ sandbox }) => { +// // TODO: Implement +// }) +// +// sandboxTest('mouse scroll', async ({ sandbox }) => { +// // TODO: Implement +// }) diff --git a/packages/js-sdk/tests/setup.ts b/packages/js-sdk/tests/setup.ts index 28beee9..2a2c084 100644 --- a/packages/js-sdk/tests/setup.ts +++ b/packages/js-sdk/tests/setup.ts @@ -10,7 +10,8 @@ interface SandboxFixture { export const sandboxTest = base.extend({ sandbox: [ - async ({ }, use) => { + // eslint-disable-next-line no-empty-pattern + async ({}, use) => { const sandbox = await Sandbox.create(template, { timeoutMs }) try { await use(sandbox) @@ -34,4 +35,4 @@ export const isDebug = process.env.E2B_DEBUG !== undefined export async function wait(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)) -} \ No newline at end of file +} diff --git a/packages/js-sdk/tsup.config.js b/packages/js-sdk/tsup.config.js index 02a161c..b3f7ac9 100644 --- a/packages/js-sdk/tsup.config.js +++ b/packages/js-sdk/tsup.config.js @@ -2,7 +2,7 @@ import { defineConfig } from 'tsup' export default defineConfig({ minify: false, - target: ['es2015'], + target: ['es2017'], sourcemap: true, dts: true, format: ['esm', 'cjs'], diff --git a/packages/js-sdk/typedoc.json b/packages/js-sdk/typedoc.json deleted file mode 100644 index 1ec4a8c..0000000 --- a/packages/js-sdk/typedoc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "out": "sdk_ref", - "plugin": ["typedoc-plugin-markdown", "./scripts/CustomMarkdownTheme.js"], - "exclude": ["**/*.spec.ts"], - "entryPoints": ["src/index.ts", "src/sandbox.ts"], - "excludeExternals": true, - "excludePrivate": true, - "excludeProtected": true, - "navigation": { - "includeGroups": false, - "includeCategories": false - }, - "outputFileStrategy": "modules", - "readme": "none", - "disableSources": true, - // typedoc-plugin-markdown options - "classPropertiesFormat": "table", - "typeDeclarationFormat": "table", - "enumMembersFormat": "table", - "parametersFormat": "table", - "expandParameters": true, - "useCodeBlocks": true, - "hidePageTitle": true, - "hideBreadcrumbs": true -} diff --git a/packages/js-sdk/vitest.config.ts b/packages/js-sdk/vitest.config.ts index 14516e7..0a5def2 100644 --- a/packages/js-sdk/vitest.config.ts +++ b/packages/js-sdk/vitest.config.ts @@ -16,7 +16,7 @@ export default defineConfig({ globals: false, testTimeout: 30000, environment: 'node', - bail: 1, + bail: 0, server: {}, deps: { interopDefault: true, @@ -26,4 +26,4 @@ export default defineConfig({ ...env.parsed, }, }, -}) \ No newline at end of file +}) diff --git a/packages/python-sdk/LICENSE b/packages/python-sdk/LICENSE new file mode 100644 index 0000000..4aa6529 --- /dev/null +++ b/packages/python-sdk/LICENSE @@ -0,0 +1,9 @@ +MIT License + +Copyright (c) 2025 FOUNDRYLABS, INC. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/python-sdk/README.md b/packages/python-sdk/README.md index e3ed9ac..b8dcb09 100644 --- a/packages/python-sdk/README.md +++ b/packages/python-sdk/README.md @@ -15,6 +15,7 @@ Check out the [example open-source app](https://github.com/e2b-dev/open-computer ### Basic SDK usage examples Check out the examples directory for more examples on how to use the SDK: + - [Python](./examples/basic-python) - [JavaScript](./examples/basic-javascript) @@ -38,15 +39,31 @@ pip install e2b-desktop ```python from e2b_desktop import Sandbox -# Basic initialization -desktop = Sandbox() +# Create a new desktop sandbox +desktop = Sandbox.create() + +# Launch an application +desktop.launch('google-chrome') # or vscode, firefox, etc. + +# Wait 10s for the application to open +desktop.wait(10000) -# With custom configuration -desktop = Sandbox( - display=":0", # Custom display (defaults to :0) - resolution=(1920, 1080), # Custom resolution - dpi=96, # Custom DPI +# Stream the application's window +# Note: There can be only one stream at a time +# You need to stop the current stream before streaming another application +desktop.stream.start( + window_id=desktop.get_current_window_id(), # if not provided the whole desktop will be streamed + require_auth=True ) + +# Get the stream auth key +auth_key = desktop.stream.get_auth_key() + +# Print the stream URL +print('Stream URL:', desktop.stream.get_url(auth_key=auth_key)) + +# Kill the sandbox after the tasks are finished +# desktop.kill() ``` ## Features @@ -55,7 +72,7 @@ desktop = Sandbox( ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Start the stream desktop.stream.start() @@ -72,7 +89,7 @@ desktop.stream.stop() ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Start the stream desktop.stream.start( @@ -90,11 +107,36 @@ print(url) desktop.stream.stop() ``` +### Streaming specific application + +> [!WARNING] +> +> - Will raise an error if the desired application is not open yet +> - The stream will close once the application closes +> - Creating multiple streams at the same time is not supported, you may have to stop the current stream and start a new one for each application + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Get current (active) window ID +window_id = desktop.get_current_window_id() + +# Get all windows of the application +window_ids = desktop.get_application_windows("Firefox") + +# Start the stream +desktop.stream.start(window_id=window_ids[0]) + +# Stop the stream +desktop.stream.stop() +``` + ### Mouse control ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() desktop.double_click() desktop.left_click() @@ -114,7 +156,7 @@ desktop.mouse_release("left") # Release the mouse button ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Write text at the current cursor position with customizable typing speed desktop.write("Hello, world!") # Default: chunk_size=25, delay_in_ms=75 @@ -127,11 +169,27 @@ desktop.press("backspace") desktop.press(["ctrl", "c"]) # Key combination ``` +### Window control + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Get current (active) window ID +window_id = desktop.get_current_window_id() + +# Get all windows of the application +window_ids = desktop.get_application_windows("Firefox") + +# Get window title +title = desktop.get_window_title(window_id) +``` + ### Screenshot ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Take a screenshot and save it as "screenshot.png" locally image = desktop.screenshot() @@ -144,18 +202,28 @@ with open("screenshot.png", "wb") as f: ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Open file with default application desktop.files.write("/home/user/index.js", "console.log('hello')") # First create the file desktop.open("/home/user/index.js") # Then open it ``` +### Launch applications + +```python +from e2b_desktop import Sandbox +desktop = Sandbox.create() + +# Launch the application +desktop.launch('google-chrome') +``` + ### Run any bash commands ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() # Run any bash command out = desktop.commands.run("ls -la /home/user") @@ -166,7 +234,7 @@ print(out) ```python from e2b_desktop import Sandbox -desktop = Sandbox() +desktop = Sandbox.create() desktop.wait(1000) # Wait for 1 second ``` diff --git a/packages/python-sdk/e2b_desktop/__init__.py b/packages/python-sdk/e2b_desktop/__init__.py index a642f90..163338b 100644 --- a/packages/python-sdk/e2b_desktop/__init__.py +++ b/packages/python-sdk/e2b_desktop/__init__.py @@ -1,3 +1,3 @@ from e2b import * -from .main import Sandbox \ No newline at end of file +from .main import Sandbox diff --git a/packages/python-sdk/e2b_desktop/main.py b/packages/python-sdk/e2b_desktop/main.py index 302c063..c3cabf4 100644 --- a/packages/python-sdk/e2b_desktop/main.py +++ b/packages/python-sdk/e2b_desktop/main.py @@ -1,16 +1,20 @@ import time from re import search as re_search from shlex import quote as quote_string -from typing import Callable, Dict, Iterator, Literal, Optional, overload, Tuple +from typing import Callable, Dict, Iterator, Literal, Optional, overload, Tuple, Union from uuid import uuid4 -from e2b import Sandbox as SandboxBase, CommandHandle, CommandResult, TimeoutException, CommandExitException +from e2b import ( + Sandbox as SandboxBase, + CommandHandle, + CommandResult, + TimeoutException, + CommandExitException, +) +from e2b.connection_config import ApiParams +from typing_extensions import Self, Unpack -MOUSE_BUTTONS = { - "left": 1, - "right": 3, - "middle": 2 -} +MOUSE_BUTTONS = {"left": 1, "right": 3, "middle": 2} KEYS = { "alt": "Alt_L", @@ -66,20 +70,21 @@ "tab": "Tab", "up": "Up", "win": "Super_L", - "windows": "Super_L" + "windows": "Super_L", } + def map_key(key: str) -> str: lower_key = key.lower() if lower_key in KEYS: return KEYS[lower_key] return lower_key + class _VNCServer: def __init__(self, desktop: "Sandbox") -> None: - self.__vnc_handle: CommandHandle | None = None - self.__novnc_handle: CommandHandle | None = None - + self.__novnc_handle: Optional[CommandHandle] = None + self._vnc_port = 5900 self._port = 6080 self._novnc_auth_enabled = False @@ -93,77 +98,104 @@ def _wait_for_port(self, port: int) -> bool: return self.__desktop._wait_and_verify( f'netstat -tuln | grep ":{port} "', lambda r: r.stdout.strip() != "" ) - + + def _check_vnc_running(self) -> bool: + try: + self.__desktop.commands.run("pgrep -x x11vnc") + return True + except CommandExitException: + return False + @staticmethod def _generate_password(length: int = 16) -> str: import secrets import string characters = string.ascii_letters + string.digits - return ''.join(secrets.choice(characters) for _ in range(length)) + return "".join(secrets.choice(characters) for _ in range(length)) - def get_url(self, auto_connect: bool = True, auth_key: Optional[str] = None) -> str: + def get_url( + self, + auto_connect: bool = True, + view_only: bool = False, + resize: str = "scale", + auth_key: Optional[str] = None, + ) -> str: params = [] if auto_connect: params.append("autoconnect=true") + if view_only: + params.append("view_only=true") + if resize: + params.append(f"resize={resize}") if auth_key: params.append(f"password={auth_key}") if params: return f"{self._url}?{'&'.join(params)}" return self._url - + def get_auth_key(self) -> str: if not self._novnc_password: - raise RuntimeError('Unable to retrieve stream auth key, check if require_auth is enabled') + raise RuntimeError( + "Unable to retrieve stream auth key, check if require_auth is enabled" + ) return self._novnc_password - def start(self, vnc_port: Optional[int] = None, port: Optional[int] = None, require_auth: bool = False) -> None: - # If both servers are already running, throw an error - if self.__vnc_handle is not None and self.__novnc_handle is not None: - raise RuntimeError('Server is already running') + def start( + self, + vnc_port: Optional[int] = None, + port: Optional[int] = None, + require_auth: bool = False, + window_id: Optional[str] = None, + ) -> None: + # If stream is already running, throw an error + if self._check_vnc_running(): + raise RuntimeError("Stream is already running") - # Stop servers in case one of them is running - self.stop() - # Update parameters if provided self._vnc_port = vnc_port or self._vnc_port self._port = port or self._port self._novnc_auth_enabled = require_auth or self._novnc_auth_enabled self._novnc_password = self._generate_password() if require_auth else None - + # Update URL with new port self._url = f"https://{self.__desktop.get_host(self._port)}/vnc.html" - + # Set up VNC command pwd_flag = "-nopw" if self._novnc_auth_enabled: - self.__desktop.commands.run("mkdir ~/.vnc") - self.__desktop.commands.run(f"x11vnc -storepasswd {self._novnc_password} ~/.vnc/passwd") + self.__desktop.commands.run("mkdir -p ~/.vnc") + self.__desktop.commands.run( + f"x11vnc -storepasswd {self._novnc_password} ~/.vnc/passwd" + ) pwd_flag = "-usepw" + window_id_flag = "" + if window_id: + window_id_flag = f"-id {window_id}" + vnc_command = ( - f"x11vnc -display {self.__desktop._display} -forever -wait 50 -shared " - f"-rfbport {self._vnc_port} {pwd_flag} 2>/tmp/x11vnc_stderr.log" + f"x11vnc -bg -display {self.__desktop._display} -forever -wait 50 -shared " + f"-rfbport {self._vnc_port} {pwd_flag} 2>/tmp/x11vnc_stderr.log {window_id_flag}" ) - + novnc_command = ( f"cd /opt/noVNC/utils && ./novnc_proxy --vnc localhost:{self._vnc_port} " f"--listen {self._port} --web /opt/noVNC > /tmp/novnc.log 2>&1" ) - self.__vnc_handle = self.__desktop.commands.run(vnc_command, background=True) - if not self._wait_for_port(self._vnc_port): - raise TimeoutException("Could not start VNC server") + self.__desktop.commands.run(vnc_command) - self.__novnc_handle = self.__desktop.commands.run(novnc_command, background=True) + self.__novnc_handle = self.__desktop.commands.run( + novnc_command, background=True, timeout=0 + ) if not self._wait_for_port(self._port): raise TimeoutException("Could not start noVNC server") def stop(self) -> None: - if self.__vnc_handle: - self.__vnc_handle.kill() - self.__vnc_handle = None - + if self._check_vnc_running(): + self.__desktop.commands.run("pkill x11vnc") + if self.__novnc_handle: self.__novnc_handle.kill() self.__novnc_handle = None @@ -171,84 +203,161 @@ def stop(self) -> None: class Sandbox(SandboxBase): default_template = "desktop" - change_wallpaper_cmd = ( - "xfconf-query --create -t string -c xfce4-desktop -p " - "/backdrop/screen0/monitorscreen/workspace0/last-image -s /usr/share/backgrounds/xfce/wallpaper.png" - ) + __vnc_server: _VNCServer + _last_xfce4_pid: Optional[str] = None + _display: str - def __init__( - self, - resolution: Optional[Tuple[int, int]] = None, + @classmethod + def create( + cls, + template: Optional[str] = None, + resolution: Optional[Tuple[int, int]] = None, dpi: Optional[int] = None, display: Optional[str] = None, - template: Optional[str] = None, timeout: Optional[int] = None, metadata: Optional[Dict[str, str]] = None, envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None, - ): + secure: bool = True, + allow_internet_access: bool = True, + **opts: Unpack[ApiParams], + ) -> Self: """ - Create a new desktop sandbox. + Create a new sandbox. + + By default, the sandbox is created from the default `desktop` sandbox template. - By default, the sandbox is created from the `desktop` template. + :param template: Sandbox template name or ID :param resolution: Startup the desktop with custom screen resolution. Defaults to (1024, 768) :param dpi: Startup the desktop with custom DPI. Defaults to 96 :param display: Startup the desktop with custom display. Defaults to ":0" + :param timeout: Timeout for the sandbox in **seconds**, default to 300 seconds. The maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users. + :param metadata: Custom metadata for the sandbox + :param envs: Custom environment variables for the sandbox + :param secure: Envd is secured with access token and cannot be used without it + :param allow_internet_access: Allow sandbox to access the internet, defaults to `True`. + + :return: A Sandbox instance for the new sandbox + + Use this method instead of using the constructor to create a new sandbox. + """ + + # Initialize environment variables with DISPLAY + display = display or ":0" + if envs is None: + envs = {} + envs["DISPLAY"] = display + + sbx = super().create( + template=template, + timeout=timeout, + metadata=metadata, + envs=envs, + secure=secure, + allow_internet_access=allow_internet_access, + **opts, + ) + + sbx._display = display + width, height = resolution or (1024, 768) + sbx.commands.run( + f"Xvfb {display} -ac -screen 0 {width}x{height}x24" + f" -retro -dpi {dpi or 96} -nolisten tcp -nolisten unix", + background=True, + timeout=0, + ) + + if not sbx._wait_and_verify( + f"xdpyinfo -display {display}", lambda r: r.exit_code == 0 + ): + raise TimeoutException("Could not start Xvfb") + + sbx.__vnc_server = _VNCServer(sbx) + sbx._start_xfce4() + + return sbx + + @classmethod + def beta_create( + cls, + template: Optional[str] = None, + resolution: Optional[Tuple[int, int]] = None, + dpi: Optional[int] = None, + display: Optional[str] = None, + timeout: Optional[int] = None, + auto_pause: Optional[bool] = False, + metadata: Optional[Dict[str, str]] = None, + envs: Optional[Dict[str, str]] = None, + secure: bool = True, + allow_internet_access: bool = True, + **opts: Unpack[ApiParams], + ) -> Self: + """ + [BETA] This feature is in beta and may change in the future. + + Create a new sandbox. + + By default, the sandbox is created from the default `desktop` sandbox template. + + :param template: Sandbox template name or ID - :param timeout: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users + :param resolution: Startup the desktop with custom screen resolution. Defaults to (1024, 768) + :param dpi: Startup the desktop with custom DPI. Defaults to 96 + :param display: Startup the desktop with custom display. Defaults to ":0" + :param timeout: Timeout for the sandbox in **seconds**, default to 300 seconds. The maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users. + :param auto_pause: Automatically pause the sandbox after the timeout expires. Defaults to `False`. :param metadata: Custom metadata for the sandbox :param envs: Custom environment variables for the sandbox - :param api_key: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable - :param domain: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable - :param debug: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable - :param sandbox_id: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable - :param request_timeout: Timeout for the request in **seconds** + :param secure: Envd is secured with access token and cannot be used without it + :param allow_internet_access: Allow sandbox to access the internet, defaults to `True`. + + :return: A Sandbox instance for the new sandbox - :return: sandbox instance for the new sandbox + Use this method instead of using the constructor to create a new sandbox. """ - super().__init__( + + # Initialize environment variables with DISPLAY + display = display or ":0" + if envs is None: + envs = {} + envs["DISPLAY"] = display + + sbx = super().beta_create( template=template, timeout=timeout, metadata=metadata, envs=envs, - api_key=api_key, - domain=domain, - debug=debug, - sandbox_id=sandbox_id, - request_timeout=request_timeout, + secure=secure, + allow_internet_access=allow_internet_access, + **opts, ) - self._display = display or ":0" - self._last_xfce4_pid = None + sbx._display = display width, height = resolution or (1024, 768) - self.commands.run( - f"Xvfb {self._display} -ac -screen 0 {width}x{height}x24" + sbx.commands.run( + f"Xvfb {display} -ac -screen 0 {width}x{height}x24" f" -retro -dpi {dpi or 96} -nolisten tcp -nolisten unix", - background=True + background=True, + timeout=0, ) - if not self._wait_and_verify( - f"xdpyinfo -display {self._display}", lambda r: r.exit_code == 0 + if not sbx._wait_and_verify( + f"xdpyinfo -display {display}", lambda r: r.exit_code == 0 ): raise TimeoutException("Could not start Xvfb") - self.__vnc_server = _VNCServer(self) - self._start_xfce4() + sbx.__vnc_server = _VNCServer(sbx) + sbx._start_xfce4() + return sbx def _wait_and_verify( - self, - cmd: str, + self, + cmd: str, on_result: Callable[[CommandResult], bool], timeout: int = 10, - interval: float = 0.5 + interval: float = 0.5, ) -> bool: - elapsed = 0 while elapsed < timeout: try: @@ -256,23 +365,24 @@ def _wait_and_verify( return True except CommandExitException: continue - + time.sleep(interval) elapsed += interval return False - + def _start_xfce4(self): """ Start xfce4 session if logged out or not running. """ if self._last_xfce4_pid is None or "[xfce4-session] " in ( - self.commands.run(f"ps aux | grep {self._last_xfce4_pid} | grep -v grep | head -n 1").stdout.strip() + self.commands.run( + f"ps aux | grep {self._last_xfce4_pid} | grep -v grep | head -n 1" + ).stdout.strip() ): self._last_xfce4_pid = self.commands.run( - "startxfce4", envs={"DISPLAY": self._display}, background=True + "startxfce4", background=True, timeout=0 ).pid - self.commands.run(self.change_wallpaper_cmd, envs={"DISPLAY": self._display}) @property def stream(self) -> _VNCServer: @@ -305,7 +415,7 @@ def screenshot( """ screenshot_path = f"/tmp/screenshot-{uuid4()}.png" - self.commands.run(f"scrot --pointer {screenshot_path}", envs={"DISPLAY": self._display}) + self.commands.run(f"scrot --pointer {screenshot_path}") file = self.files.read(screenshot_path, format=format) self.files.remove(screenshot_path) @@ -317,7 +427,7 @@ def left_click(self, x: Optional[int] = None, y: Optional[int] = None): """ if x and y: self.move_mouse(x, y) - self.commands.run("xdotool click 1", envs={"DISPLAY": self._display}) + self.commands.run("xdotool click 1") def double_click(self, x: Optional[int] = None, y: Optional[int] = None): """ @@ -325,7 +435,7 @@ def double_click(self, x: Optional[int] = None, y: Optional[int] = None): """ if x and y: self.move_mouse(x, y) - self.commands.run("xdotool click --repeat 2 1", envs={"DISPLAY": self._display}) + self.commands.run("xdotool click --repeat 2 1") def right_click(self, x: Optional[int] = None, y: Optional[int] = None): if (x is None) != (y is None): @@ -335,7 +445,7 @@ def right_click(self, x: Optional[int] = None, y: Optional[int] = None): """ if x and y: self.move_mouse(x, y) - self.commands.run("xdotool click 3", envs={"DISPLAY": self._display}) + self.commands.run("xdotool click 3") def middle_click(self, x: Optional[int] = None, y: Optional[int] = None): """ @@ -343,7 +453,7 @@ def middle_click(self, x: Optional[int] = None, y: Optional[int] = None): """ if x and y: self.move_mouse(x, y) - self.commands.run("xdotool click 2", envs={"DISPLAY": self._display}) + self.commands.run("xdotool click 2") def scroll(self, direction: Literal["up", "down"] = "down", amount: int = 1): """ @@ -353,31 +463,30 @@ def scroll(self, direction: Literal["up", "down"] = "down", amount: int = 1): :param amount: The amount to scroll. """ self.commands.run( - f"xdotool click --repeat {amount} {'4' if direction == 'up' else '5'}", - envs={"DISPLAY": self._display} + f"xdotool click --repeat {amount} {'4' if direction == 'up' else '5'}" ) def move_mouse(self, x: int, y: int): """ Move the mouse to the given coordinates. - + :param x: The x coordinate. :param y: The y coordinate. """ - self.commands.run(f"xdotool mousemove --sync {x} {y}", envs={"DISPLAY": self._display}) + self.commands.run(f"xdotool mousemove --sync {x} {y}") def mouse_press(self, button: Literal["left", "right", "middle"] = "left"): """ Press the mouse button. """ - self.commands.run(f"xdotool mousedown {MOUSE_BUTTONS[button]}", envs={"DISPLAY": self._display}) + self.commands.run(f"xdotool mousedown {MOUSE_BUTTONS[button]}") def mouse_release(self, button: Literal["left", "right", "middle"] = "left"): """ Release the mouse button. """ - self.commands.run(f"xdotool mouseup {MOUSE_BUTTONS[button]}", envs={"DISPLAY": self._display}) - + self.commands.run(f"xdotool mouseup {MOUSE_BUTTONS[button]}") + def get_cursor_position(self) -> tuple[int, int]: """ Get the current cursor position. @@ -385,18 +494,20 @@ def get_cursor_position(self) -> tuple[int, int]: :return: A tuple with the x and y coordinates :raises RuntimeError: If the cursor position cannot be determined """ - result = self.commands.run("xdotool getmouselocation", envs={"DISPLAY": self._display}) - + result = self.commands.run("xdotool getmouselocation") + groups = re_search(r"x:(\d+)\s+y:(\d+)", result.stdout) if not groups: - raise RuntimeError(f"Failed to parse cursor position from output: {result.stdout}") - + raise RuntimeError( + f"Failed to parse cursor position from output: {result.stdout}" + ) + x, y = groups.group(1), groups.group(2) if not x or not y: raise RuntimeError(f"Invalid cursor position values: x={x}, y={y}") - + return int(x), int(y) - + def get_screen_size(self) -> tuple[int, int]: """ Get the current screen size. @@ -404,40 +515,38 @@ def get_screen_size(self) -> tuple[int, int]: :return: A tuple with the width and height :raises RuntimeError: If the screen size cannot be determined """ - result = self.commands.run("xrandr", envs={"DISPLAY": self._display}) - + result = self.commands.run("xrandr") + _match = re_search(r"(\d+x\d+)", result.stdout) if not _match: - raise RuntimeError(f"Failed to parse screen size from output: {result.stdout}") - + raise RuntimeError( + f"Failed to parse screen size from output: {result.stdout}" + ) + try: return tuple(map(int, _match.group(1).split("x"))) # type: ignore except (ValueError, IndexError) as e: raise RuntimeError(f"Invalid screen size format: {_match.group(1)}") from e - def write(self, - text: str, - *, - chunk_size: int = 25, - delay_in_ms: int = 75 - ) -> None: + def write(self, text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None: """ Write the given text at the current cursor position. - + :param text: The text to write. :param chunk_size: The size of each chunk of text to write. :param delay_in_ms: The delay between each chunk of text. """ + def break_into_chunks(text: str, n: int): for i in range(0, len(text), n): yield text[i : i + n] for chunk in break_into_chunks(text, chunk_size): self.commands.run( - f"xdotool type --delay {delay_in_ms} {quote_string(chunk)}", envs={"DISPLAY": self._display} + f"xdotool type --delay {delay_in_ms} -- {quote_string(chunk)}" ) - def press(self, key: str | list[str]): + def press(self, key: Union[str, list[str]]): """ Press a key. @@ -448,7 +557,7 @@ def press(self, key: str | list[str]): else: key = map_key(key) - self.commands.run(f"xdotool key {key}", envs={"DISPLAY": self._display}) + self.commands.run(f"xdotool key {key}") def drag(self, fr: tuple[int, int], to: tuple[int, int]): """ @@ -468,7 +577,7 @@ def wait(self, ms: int): :param ms: The amount of time to wait in milliseconds. """ - self.commands.run(f"sleep {ms / 1000}", envs={"DISPLAY": self._display}) + self.commands.run(f"sleep {ms / 1000}") def open(self, file_or_url: str): """ @@ -476,4 +585,34 @@ def open(self, file_or_url: str): :param file_or_url: The file or URL to open. """ - self.commands.run(f"xdg-open {file_or_url}", background=True, envs={"DISPLAY": self._display}) + self.commands.run(f"xdg-open {file_or_url}", background=True) + + def get_current_window_id(self) -> str: + """ + Get the current window ID. + """ + return self.commands.run("xdotool getwindowfocus").stdout.strip() + + def get_application_windows(self, application: str) -> list[str]: + """ + Get the window IDs of all windows for the given application. + """ + return ( + self.commands.run(f"xdotool search --onlyvisible --class {application}") + .stdout.strip() + .split("\n") + ) + + def get_window_title(self, window_id: str) -> str: + """ + Get the title of the window with the given ID. + """ + return self.commands.run(f"xdotool getwindowname {window_id}").stdout.strip() + + def launch(self, application: str, uri: Optional[str] = None): + """ + Launch an application. + """ + self.commands.run( + f"gtk-launch {application} {uri or ''}", background=True, timeout=0 + ) diff --git a/packages/python-sdk/example.py b/packages/python-sdk/example.py new file mode 100644 index 0000000..cb70086 --- /dev/null +++ b/packages/python-sdk/example.py @@ -0,0 +1,58 @@ +import os +import time +from dotenv import load_dotenv +import asyncio +from e2b_desktop import Sandbox +import math +import random + +# Load environment variables +load_dotenv() + + +async def main(): + print("Starting desktop sandbox...") + + print("--> Sandbox creation time", end="") + start_time = time.time() + desktop = Sandbox.create() + end_time = time.time() + print(f": {end_time - start_time:.3f}s") + + print("Desktop Sandbox started, ID:", desktop.sandbox_id) + screen_size = desktop.get_screen_size() + print("Screen size:", screen_size) + + desktop.stream.start(require_auth=True) + + auth_key = desktop.stream.get_auth_key() + print("Stream URL:", desktop.stream.get_url(auth_key=auth_key)) + + await asyncio.sleep(5) + + print("Moving mouse to 'Applications' and clicking...") + desktop.move_mouse(100, 100) + desktop.left_click() + cursor_position = desktop.get_cursor_position() + print("Cursor position:", cursor_position) + + await asyncio.sleep(1) + + screenshot = desktop.screenshot("bytes") + with open("1.png", "wb") as f: + f.write(screenshot) + + for i in range(20): + x = math.floor(random.random() * 1024) + y = math.floor(random.random() * 768) + desktop.move_mouse(x, y) + await asyncio.sleep(2) + desktop.right_click() + print("right clicked", i) + + desktop.stream.stop() + desktop.kill() + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/packages/python-sdk/package.json b/packages/python-sdk/package.json index 5bf4568..1b01aa9 100644 --- a/packages/python-sdk/package.json +++ b/packages/python-sdk/package.json @@ -1,7 +1,7 @@ { "name": "@e2b/desktop-python", "private": true, - "version": "1.5.2", + "version": "2.3.0", "scripts": { "test": "poetry run pytest -n 4 --verbose -x", "example": "poetry run python3 example.py", @@ -9,6 +9,7 @@ "postVersion": "poetry version $(pnpm pkg get version --workspaces=false | tr -d \\\")", "postPublish": "poetry build && poetry config pypi-token.pypi ${PYPI_TOKEN} && poetry publish --skip-existing", "pretest": "poetry install", - "generate-ref": "poetry install && ./scripts/generate_sdk_ref.sh" + "lint": "poetry run ruff check .", + "format": "poetry run ruff format ." } -} \ No newline at end of file +} diff --git a/packages/python-sdk/poetry.lock b/packages/python-sdk/poetry.lock index 854bee3..e6ed587 100644 --- a/packages/python-sdk/poetry.lock +++ b/packages/python-sdk/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. [[package]] name = "anyio" @@ -6,6 +6,7 @@ version = "4.6.2.post1" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d"}, {file = "anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c"}, @@ -19,7 +20,7 @@ typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21.0b1) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\""] trio = ["trio (>=0.26.1)"] [[package]] @@ -28,71 +29,39 @@ version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\""] [[package]] -name = "black" -version = "23.12.1" -description = "The uncompromising code formatter." +name = "bracex" +version = "2.6" +description = "Bash style brace expander." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "black-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, - {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, - {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, - {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, - {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, - {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, - {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, - {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, - {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, - {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, - {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, - {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, - {file = "black-23.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1fa88a0f74e50e4487477bc0bb900c6781dbddfdfa32691e780bf854c3b4a47f"}, - {file = "black-23.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4d6a9668e45ad99d2f8ec70d5c8c04ef4f32f648ef39048d010b0689832ec6d"}, - {file = "black-23.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b18fb2ae6c4bb63eebe5be6bd869ba2f14fd0259bda7d18a46b764d8fb86298a"}, - {file = "black-23.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:c04b6d9d20e9c13f43eee8ea87d44156b8505ca8a3c878773f68b4e4812a421e"}, - {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, - {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, - {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, - {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, - {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, - {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, + {file = "bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952"}, + {file = "bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7"}, ] -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -packaging = ">=22.0" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - [[package]] name = "certifi" version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, @@ -104,6 +73,7 @@ version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" +groups = ["main"] files = [ {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, @@ -212,159 +182,54 @@ files = [ {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] -[[package]] -name = "click" -version = "8.1.7" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=3.7" -files = [ - {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, - {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - [[package]] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["dev"] +markers = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] [[package]] -name = "databind" -version = "4.5.2" -description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. The `databind` package will install the full suite of databind packages. Compatible with Python 3.8 and newer." -optional = false -python-versions = "<4.0.0,>=3.8.0" -files = [ - {file = "databind-4.5.2-py3-none-any.whl", hash = "sha256:b9c3a03c0414aa4567f095d7218ac904bd2b267b58e3763dac28e83d64b69770"}, - {file = "databind-4.5.2.tar.gz", hash = "sha256:0a8aa0ff130a0306581c559388f5ef65e0fae7ef4b86412eacb1f4a0420006c4"}, -] - -[package.dependencies] -Deprecated = ">=1.2.12,<2.0.0" -nr-date = ">=2.0.0,<3.0.0" -nr-stream = ">=1.0.0,<2.0.0" -setuptools = {version = ">=40.8.0", markers = "python_version < \"3.10\""} -typeapi = ">=2.0.1,<3" -typing-extensions = ">=3.10.0,<5" - -[[package]] -name = "databind-core" -version = "4.5.2" -description = "Databind is a library inspired by jackson-databind to de-/serialize Python dataclasses. Compatible with Python 3.8 and newer. Deprecated, use `databind` package." -optional = false -python-versions = "<4.0.0,>=3.8.0" -files = [ - {file = "databind.core-4.5.2-py3-none-any.whl", hash = "sha256:a1dd1c6bd8ca9907d1292d8df9ec763ce91543e27f7eda4268e4a1a84fcd1c42"}, - {file = "databind.core-4.5.2.tar.gz", hash = "sha256:b8ac8127bc5d6b239a2a81aeddb268b0c4cadd53fbce7e8b2c7a9ef6413bccb3"}, -] - -[package.dependencies] -databind = ">=4.5.2,<5.0.0" - -[[package]] -name = "databind-json" -version = "4.5.2" -description = "De-/serialize Python dataclasses to or from JSON payloads. Compatible with Python 3.8 and newer. Deprecated, use `databind` module instead." -optional = false -python-versions = "<4.0.0,>=3.8.0" -files = [ - {file = "databind.json-4.5.2-py3-none-any.whl", hash = "sha256:a803bf440634685984361cb2a5a975887e487c854ed48d81ff7aaf3a1ed1e94c"}, - {file = "databind.json-4.5.2.tar.gz", hash = "sha256:6cc9b5c6fddaebd49b2433932948eb3be8a41633b90aa37998d7922504b8f165"}, -] - -[package.dependencies] -databind = ">=4.5.2,<5.0.0" - -[[package]] -name = "deprecated" -version = "1.2.15" -description = "Python @deprecated decorator to deprecate old python classes, functions or methods." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "Deprecated-1.2.15-py2.py3-none-any.whl", hash = "sha256:353bc4a8ac4bfc96800ddab349d89c25dec1079f65fd53acdcc1e0b975b21320"}, - {file = "deprecated-1.2.15.tar.gz", hash = "sha256:683e561a90de76239796e6b6feac66b99030d2dd3fcf61ef996330f14bbb9b0d"}, -] - -[package.dependencies] -wrapt = ">=1.10,<2" - -[package.extras] -dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "jinja2 (>=3.0.3,<3.1.0)", "setuptools", "sphinx (<2)", "tox"] - -[[package]] -name = "docspec" -version = "2.2.1" -description = "Docspec is a JSON object specification for representing API documentation of programming languages." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "docspec-2.2.1-py3-none-any.whl", hash = "sha256:7538f750095a9688c6980ff9a4e029a823a500f64bd00b6b4bdb27951feb31cb"}, - {file = "docspec-2.2.1.tar.gz", hash = "sha256:4854e77edc0e2de40e785e57e95880f7095a05fe978f8b54cef7a269586e15ff"}, -] - -[package.dependencies] -"databind.core" = ">=4.2.6,<5.0.0" -"databind.json" = ">=4.2.6,<5.0.0" -Deprecated = ">=1.2.12,<2.0.0" - -[[package]] -name = "docspec-python" -version = "2.2.1" -description = "A parser based on lib2to3 producing docspec data from Python source code." -optional = false -python-versions = ">=3.7,<4.0" -files = [ - {file = "docspec_python-2.2.1-py3-none-any.whl", hash = "sha256:76ac41d35a8face35b2d766c2e8a416fb8832359785d396f0d53bcb00f178e54"}, - {file = "docspec_python-2.2.1.tar.gz", hash = "sha256:c41b850b4d6f4de30999ea6f82c9cdb9183d9bcba45559ee9173d3dab7281559"}, -] - -[package.dependencies] -black = ">=23.1.0,<24.0.0" -docspec = ">=2.2.1,<3.0.0" -"nr.util" = ">=0.7.0" - -[[package]] -name = "docstring-parser" -version = "0.11" -description = "\"Parse Python docstrings in reST, Google and Numpydoc format\"" +name = "dockerfile-parse" +version = "2.0.1" +description = "Python library for Dockerfile manipulation" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ - {file = "docstring_parser-0.11.tar.gz", hash = "sha256:93b3f8f481c7d24e37c5d9f30293c89e2933fa209421c8abd731dd3ef0715ecb"}, + {file = "dockerfile-parse-2.0.1.tar.gz", hash = "sha256:3184ccdc513221983e503ac00e1aa504a2aa8f84e5de673c46b0b6eee99ec7bc"}, + {file = "dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6"}, ] -[package.extras] -test = ["black", "pytest"] - [[package]] name = "e2b" -version = "1.0.4" +version = "2.16.0" description = "E2B SDK that give agents cloud environments" optional = false -python-versions = "<4.0,>=3.8" +python-versions = "<4.0,>=3.10" +groups = ["main"] files = [ - {file = "e2b-1.0.4-py3-none-any.whl", hash = "sha256:1a9c765eb1b2cc291c5ebd3f2e268f8fba9471a12f470f4651395b5753730170"}, - {file = "e2b-1.0.4.tar.gz", hash = "sha256:5ed3db4f984e52cf3aabb717725493ff060a8374b7c878b31bceeff46a0b5648"}, + {file = "e2b-2.16.0-py3-none-any.whl", hash = "sha256:e2bb38fce01e1fe076818aa731b45208f2eef4b843d90b61c48cb23985a7ef52"}, + {file = "e2b-2.16.0.tar.gz", hash = "sha256:e661fbd5524bf4435730eca081de7b74861f30366731a027c1c8503316e8890c"}, ] [package.dependencies] attrs = ">=23.2.0" +dockerfile-parse = ">=2.0.1,<3.0.0" httpcore = ">=1.0.5,<2.0.0" -httpx = ">=0.27.0,<0.28.0" +httpx = ">=0.27.0,<1.0.0" packaging = ">=24.1" -protobuf = ">=3.20.0,<6.0.0" +protobuf = ">=4.21.0" python-dateutil = ">=2.8.2" +rich = ">=14.0.0" typing-extensions = ">=4.1.0" +wcmatch = ">=10.1,<11.0" [[package]] name = "exceptiongroup" @@ -372,6 +237,8 @@ version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version == \"3.10\"" files = [ {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, @@ -386,6 +253,7 @@ version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, @@ -396,29 +264,31 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] [[package]] name = "httpcore" -version = "1.0.7" +version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, - {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] [package.dependencies] certifi = "*" -h11 = ">=0.13,<0.15" +h11 = ">=0.16" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] @@ -432,6 +302,7 @@ version = "0.27.2" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, @@ -445,7 +316,7 @@ idna = "*" sniffio = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -457,6 +328,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -471,278 +343,177 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] -name = "jinja2" -version = "3.1.5" -description = "A very fast and expressive template engine." +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, - {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, ] [package.dependencies] -MarkupSafe = ">=2.0" +mdurl = ">=0.1,<1.0" [package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "markupsafe" -version = "3.0.2" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.9" -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] -name = "nr-date" -version = "2.1.0" -description = "" +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "nr_date-2.1.0-py3-none-any.whl", hash = "sha256:bd672a9dfbdcf7c4b9289fea6750c42490eaee08036a72059dcc78cb236ed568"}, - {file = "nr_date-2.1.0.tar.gz", hash = "sha256:0643aea13bcdc2a8bc56af9d5e6a89ef244c9744a1ef00cdc735902ba7f7d2e6"}, -] - -[[package]] -name = "nr-stream" -version = "1.1.5" -description = "" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "nr_stream-1.1.5-py3-none-any.whl", hash = "sha256:47e12150b331ad2cb729cfd9d2abd281c9949809729ba461c6aa87dd9927b2d4"}, - {file = "nr_stream-1.1.5.tar.gz", hash = "sha256:eb0216c6bfc61a46d4568dba3b588502c610ec8ddef4ac98f3932a2bd7264f65"}, -] - -[[package]] -name = "nr-util" -version = "0.8.12" -description = "General purpose Python utility library." -optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.7" +groups = ["main"] files = [ - {file = "nr.util-0.8.12-py3-none-any.whl", hash = "sha256:91da02ac9795eb8e015372275c1efe54bac9051231ee9b0e7e6f96b0b4e7d2bb"}, - {file = "nr.util-0.8.12.tar.gz", hash = "sha256:a4549c2033d99d2f0379b3f3d233fd2a8ade286bbf0b3ad0cc7cea16022214f4"}, + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, ] -[package.dependencies] -deprecated = ">=1.2.0,<2.0.0" -typing-extensions = ">=3.0.0" - [[package]] name = "packaging" version = "24.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, ] -[[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.8" -files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, -] - [[package]] name = "pillow" -version = "11.1.0" -description = "Python Imaging Library (Fork)" -optional = false -python-versions = ">=3.9" -files = [ - {file = "pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8"}, - {file = "pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192"}, - {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2"}, - {file = "pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26"}, - {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07"}, - {file = "pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482"}, - {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e"}, - {file = "pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269"}, - {file = "pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49"}, - {file = "pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a"}, - {file = "pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65"}, - {file = "pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457"}, - {file = "pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35"}, - {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2"}, - {file = "pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070"}, - {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6"}, - {file = "pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1"}, - {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2"}, - {file = "pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96"}, - {file = "pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f"}, - {file = "pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761"}, - {file = "pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71"}, - {file = "pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a"}, - {file = "pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b"}, - {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3"}, - {file = "pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a"}, - {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1"}, - {file = "pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f"}, - {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91"}, - {file = "pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c"}, - {file = "pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6"}, - {file = "pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf"}, - {file = "pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5"}, - {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, - {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, - {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, - {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, - {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, - {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, - {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, - {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, - {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, - {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, - {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, - {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, - {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, - {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, - {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, - {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, - {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, - {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, - {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, - {file = "pillow-11.1.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:bf902d7413c82a1bfa08b06a070876132a5ae6b2388e2712aab3a7cbc02205c6"}, - {file = "pillow-11.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c1eec9d950b6fe688edee07138993e54ee4ae634c51443cfb7c1e7613322718e"}, - {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e275ee4cb11c262bd108ab2081f750db2a1c0b8c12c1897f27b160c8bd57bbc"}, - {file = "pillow-11.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db853948ce4e718f2fc775b75c37ba2efb6aaea41a1a5fc57f0af59eee774b2"}, - {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ab8a209b8485d3db694fa97a896d96dd6533d63c22829043fd9de627060beade"}, - {file = "pillow-11.1.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:54251ef02a2309b5eec99d151ebf5c9904b77976c8abdcbce7891ed22df53884"}, - {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5bb94705aea800051a743aa4874bb1397d4695fb0583ba5e425ee0328757f196"}, - {file = "pillow-11.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89dbdb3e6e9594d512780a5a1c42801879628b38e3efc7038094430844e271d8"}, - {file = "pillow-11.1.0-cp39-cp39-win32.whl", hash = "sha256:e5449ca63da169a2e6068dd0e2fcc8d91f9558aba89ff6d02121ca8ab11e79e5"}, - {file = "pillow-11.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:3362c6ca227e65c54bf71a5f88b3d4565ff1bcbc63ae72c34b07bbb1cc59a43f"}, - {file = "pillow-11.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:b20be51b37a75cc54c2c55def3fa2c65bb94ba859dde241cd0a4fd302de5ae0a"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73"}, - {file = "pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0"}, - {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, +version = "12.1.1" +description = "Python Imaging Library (fork)" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, + {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, + {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, + {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, + {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, + {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, + {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, + {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, + {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, + {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, + {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, + {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, + {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, + {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, + {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, + {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, + {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, + {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, + {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, + {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, + {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, + {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, + {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, + {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, + {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, + {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, + {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, + {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, + {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, + {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, + {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, + {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, + {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, + {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, + {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, + {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, + {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, + {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, + {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, + {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, + {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, + {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, + {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, + {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, + {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, + {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, + {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=8.1)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions"] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] -[[package]] -name = "platformdirs" -version = "4.3.6" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." -optional = false -python-versions = ">=3.8" -files = [ - {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, - {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, -] - -[package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.11.2)"] - [[package]] name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, @@ -754,50 +525,39 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "protobuf" -version = "5.28.3" +version = "5.29.6" description = "" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "protobuf-5.28.3-cp310-abi3-win32.whl", hash = "sha256:0c4eec6f987338617072592b97943fdbe30d019c56126493111cf24344c1cc24"}, - {file = "protobuf-5.28.3-cp310-abi3-win_amd64.whl", hash = "sha256:91fba8f445723fcf400fdbe9ca796b19d3b1242cd873907979b9ed71e4afe868"}, - {file = "protobuf-5.28.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a3f6857551e53ce35e60b403b8a27b0295f7d6eb63d10484f12bc6879c715687"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:3fa2de6b8b29d12c61911505d893afe7320ce7ccba4df913e2971461fa36d584"}, - {file = "protobuf-5.28.3-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:712319fbdddb46f21abb66cd33cb9e491a5763b2febd8f228251add221981135"}, - {file = "protobuf-5.28.3-cp38-cp38-win32.whl", hash = "sha256:3e6101d095dfd119513cde7259aa703d16c6bbdfae2554dfe5cfdbe94e32d548"}, - {file = "protobuf-5.28.3-cp38-cp38-win_amd64.whl", hash = "sha256:27b246b3723692bf1068d5734ddaf2fccc2cdd6e0c9b47fe099244d80200593b"}, - {file = "protobuf-5.28.3-cp39-cp39-win32.whl", hash = "sha256:135658402f71bbd49500322c0f736145731b16fc79dc8f367ab544a17eab4535"}, - {file = "protobuf-5.28.3-cp39-cp39-win_amd64.whl", hash = "sha256:70585a70fc2dd4818c51287ceef5bdba6387f88a578c86d47bb34669b5552c36"}, - {file = "protobuf-5.28.3-py3-none-any.whl", hash = "sha256:cee1757663fa32a1ee673434fcf3bf24dd54763c79690201208bafec62f19eed"}, - {file = "protobuf-5.28.3.tar.gz", hash = "sha256:64badbc49180a5e401f373f9ce7ab1d18b63f7dd4a9cdc43c92b9f0b481cef7b"}, + {file = "protobuf-5.29.6-cp310-abi3-win32.whl", hash = "sha256:62e8a3114992c7c647bce37dcc93647575fc52d50e48de30c6fcb28a6a291eb1"}, + {file = "protobuf-5.29.6-cp310-abi3-win_amd64.whl", hash = "sha256:7e6ad413275be172f67fdee0f43484b6de5a904cc1c3ea9804cb6fe2ff366eda"}, + {file = "protobuf-5.29.6-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:b5a169e664b4057183a34bdc424540e86eea47560f3c123a0d64de4e137f9269"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:a8866b2cff111f0f863c1b3b9e7572dc7eaea23a7fae27f6fc613304046483e6"}, + {file = "protobuf-5.29.6-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:e3387f44798ac1106af0233c04fb8abf543772ff241169946f698b3a9a3d3ab9"}, + {file = "protobuf-5.29.6-cp38-cp38-win32.whl", hash = "sha256:36ade6ff88212e91aef4e687a971a11d7d24d6948a66751abc1b3238648f5d05"}, + {file = "protobuf-5.29.6-cp38-cp38-win_amd64.whl", hash = "sha256:831e2da16b6cc9d8f1654c041dd594eda43391affd3c03a91bea7f7f6da106d6"}, + {file = "protobuf-5.29.6-cp39-cp39-win32.whl", hash = "sha256:cb4c86de9cd8a7f3a256b9744220d87b847371c6b2f10bde87768918ef33ba49"}, + {file = "protobuf-5.29.6-cp39-cp39-win_amd64.whl", hash = "sha256:76e07e6567f8baf827137e8d5b8204b6c7b6488bbbff1bf0a72b383f77999c18"}, + {file = "protobuf-5.29.6-py3-none-any.whl", hash = "sha256:6b9edb641441b2da9fa8f428760fc136a49cf97a52076010cf22a2ff73438a86"}, + {file = "protobuf-5.29.6.tar.gz", hash = "sha256:da9ee6a5424b6b30fd5e45c5ea663aef540ca95f9ad99d1e887e819cdf9b8723"}, ] [[package]] -name = "pydoc-markdown" -version = "4.8.2" -description = "Create Python API documentation in Markdown format." +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8" +groups = ["main"] files = [ - {file = "pydoc_markdown-4.8.2-py3-none-any.whl", hash = "sha256:203f74119e6bb2f9deba43d452422de7c8ec31955b61e0620fa4dd8c2611715f"}, - {file = "pydoc_markdown-4.8.2.tar.gz", hash = "sha256:fb6c927e31386de17472d42f9bd3d3be2905977d026f6216881c65145aa67f0b"}, + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, ] -[package.dependencies] -click = ">=7.1,<9.0" -"databind.core" = ">=4.4.0,<5.0.0" -"databind.json" = ">=4.4.0,<5.0.0" -docspec = ">=2.2.1,<3.0.0" -docspec-python = ">=2.2.1,<3.0.0" -docstring-parser = ">=0.11,<0.12" -jinja2 = ">=3.0.0,<4.0.0" -"nr.util" = ">=0.7.5,<1.0.0" -PyYAML = ">=5.0,<7.0" -requests = ">=2.23.0,<3.0.0" -tomli = ">=2.0.0,<3.0.0" -tomli_w = ">=1.0.0,<2.0.0" -watchdog = "*" -yapf = ">=0.30.0" +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pytest" @@ -805,6 +565,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -827,6 +588,7 @@ version = "0.5.2" description = "A py.test plugin that parses environment files before running tests" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-dotenv-0.5.2.tar.gz", hash = "sha256:2dc6c3ac6d8764c71c6d2804e902d0ff810fa19692e95fe138aefc9b1aa73732"}, {file = "pytest_dotenv-0.5.2-py3-none-any.whl", hash = "sha256:40a2cece120a213898afaa5407673f6bd924b1fa7eafce6bda0e8abffe2f710f"}, @@ -838,13 +600,14 @@ python-dotenv = ">=0.9.1" [[package]] name = "pytest-xdist" -version = "3.6.1" +version = "3.8.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["dev"] files = [ - {file = "pytest_xdist-3.6.1-py3-none-any.whl", hash = "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7"}, - {file = "pytest_xdist-3.6.1.tar.gz", hash = "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d"}, + {file = "pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88"}, + {file = "pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1"}, ] [package.dependencies] @@ -862,6 +625,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -872,120 +636,88 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["dev"] files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, + {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, ] [package.extras] cli = ["click (>=5.0)"] -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - [[package]] name = "requests" -version = "2.32.3" +version = "2.33.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" +groups = ["main"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.33.0-py3-none-any.whl", hash = "sha256:3324635456fa185245e24865e810cecec7b4caf933d7eb133dcde67d48cee69b"}, + {file = "requests-2.33.0.tar.gz", hash = "sha256:c7ebc5e8b0f21837386ad0e1c8fe8b829fa5f544d8df3b2253bff14ef29d7652"}, ] [package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +certifi = ">=2023.5.7" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" +urllib3 = ">=1.26,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] +test = ["PySocks (>=1.5.6,!=1.5.7)", "pytest (>=3)", "pytest-cov", "pytest-httpbin (==2.1.0)", "pytest-mock", "pytest-xdist"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<8)"] [[package]] -name = "setuptools" -version = "75.6.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" +name = "rich" +version = "14.2.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" optional = false -python-versions = ">=3.9" +python-versions = ">=3.8.0" +groups = ["main"] files = [ - {file = "setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d"}, - {file = "setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6"}, + {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, + {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, ] +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + [package.extras] -check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.7.0)"] -core = ["importlib_metadata (>=6)", "jaraco.collections", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] -cover = ["pytest-cov"] -doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib_metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (>=1.12,<1.14)", "pytest-mypy"] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruff" +version = "0.15.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff"}, + {file = "ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3"}, + {file = "ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0"}, + {file = "ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c"}, + {file = "ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406"}, + {file = "ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837"}, + {file = "ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4"}, +] [[package]] name = "six" @@ -993,6 +725,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -1004,6 +737,7 @@ version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, @@ -1015,42 +749,20 @@ version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["dev"] +markers = "python_version == \"3.10\"" files = [ {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] -[[package]] -name = "tomli-w" -version = "1.1.0" -description = "A lil' TOML writer" -optional = false -python-versions = ">=3.9" -files = [ - {file = "tomli_w-1.1.0-py3-none-any.whl", hash = "sha256:1403179c78193e3184bfaade390ddbd071cba48a32a2e62ba11aae47490c63f7"}, - {file = "tomli_w-1.1.0.tar.gz", hash = "sha256:49e847a3a304d516a169a601184932ef0f6b61623fe680f836a2aa7128ed0d33"}, -] - -[[package]] -name = "typeapi" -version = "2.2.3" -description = "" -optional = false -python-versions = "<4.0,>=3.8" -files = [ - {file = "typeapi-2.2.3-py3-none-any.whl", hash = "sha256:038062b473dd9bc182966469d7a37d81ba7fa5bb0c01f30b0604b5667b13a47b"}, - {file = "typeapi-2.2.3.tar.gz", hash = "sha256:61cf8c852c05471522fcf55ec37d0c37f0de6943cc8e4d58529f796881e32c08"}, -] - -[package.dependencies] -typing-extensions = ">=3.0.0" - [[package]] name = "typing-extensions" version = "4.12.2" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, @@ -1058,153 +770,38 @@ files = [ [[package]] name = "urllib3" -version = "2.2.3" +version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, - {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, + {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, + {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] -name = "watchdog" -version = "6.0.0" -description = "Filesystem events monitoring" +name = "wcmatch" +version = "10.1" +description = "Wildcard/glob file name matcher." optional = false python-versions = ">=3.9" +groups = ["main"] files = [ - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, - {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, - {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, - {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, - {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, - {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, - {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, - {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, - {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, - {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, - {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, - {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, - {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, -] - -[package.extras] -watchmedo = ["PyYAML (>=3.10)"] - -[[package]] -name = "wrapt" -version = "1.17.0" -description = "Module for decorators, wrappers and monkey patching." -optional = false -python-versions = ">=3.8" -files = [ - {file = "wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df"}, - {file = "wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb"}, - {file = "wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301"}, - {file = "wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22"}, - {file = "wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575"}, - {file = "wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489"}, - {file = "wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d"}, - {file = "wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b"}, - {file = "wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346"}, - {file = "wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a"}, - {file = "wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451"}, - {file = "wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada"}, - {file = "wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4"}, - {file = "wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635"}, - {file = "wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7"}, - {file = "wrapt-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:714c12485aa52efbc0fc0ade1e9ab3a70343db82627f90f2ecbc898fdf0bb181"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da427d311782324a376cacb47c1a4adc43f99fd9d996ffc1b3e8529c4074d393"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba1739fb38441a27a676f4de4123d3e858e494fac05868b7a281c0a383c098f4"}, - {file = "wrapt-1.17.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e711fc1acc7468463bc084d1b68561e40d1eaa135d8c509a65dd534403d83d7b"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:140ea00c87fafc42739bd74a94a5a9003f8e72c27c47cd4f61d8e05e6dec8721"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73a96fd11d2b2e77d623a7f26e004cc31f131a365add1ce1ce9a19e55a1eef90"}, - {file = "wrapt-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0b48554952f0f387984da81ccfa73b62e52817a4386d070c75e4db7d43a28c4a"}, - {file = "wrapt-1.17.0-cp313-cp313-win32.whl", hash = "sha256:498fec8da10e3e62edd1e7368f4b24aa362ac0ad931e678332d1b209aec93045"}, - {file = "wrapt-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd136bb85f4568fffca995bd3c8d52080b1e5b225dbf1c2b17b66b4c5fa02838"}, - {file = "wrapt-1.17.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:17fcf043d0b4724858f25b8826c36e08f9fb2e475410bece0ec44a22d533da9b"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4a557d97f12813dc5e18dad9fa765ae44ddd56a672bb5de4825527c847d6379"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0229b247b0fc7dee0d36176cbb79dbaf2a9eb7ecc50ec3121f40ef443155fb1d"}, - {file = "wrapt-1.17.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8425cfce27b8b20c9b89d77fb50e368d8306a90bf2b6eef2cdf5cd5083adf83f"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c900108df470060174108012de06d45f514aa4ec21a191e7ab42988ff42a86c"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:4e547b447073fc0dbfcbff15154c1be8823d10dab4ad401bdb1575e3fdedff1b"}, - {file = "wrapt-1.17.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:914f66f3b6fc7b915d46c1cc424bc2441841083de01b90f9e81109c9759e43ab"}, - {file = "wrapt-1.17.0-cp313-cp313t-win32.whl", hash = "sha256:a4192b45dff127c7d69b3bdfb4d3e47b64179a0b9900b6351859f3001397dabf"}, - {file = "wrapt-1.17.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4f643df3d4419ea3f856c5c3f40fec1d65ea2e89ec812c83f7767c8730f9827a"}, - {file = "wrapt-1.17.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:69c40d4655e078ede067a7095544bcec5a963566e17503e75a3a3e0fe2803b13"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f495b6754358979379f84534f8dd7a43ff8cff2558dcdea4a148a6e713a758f"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:baa7ef4e0886a6f482e00d1d5bcd37c201b383f1d314643dfb0367169f94f04c"}, - {file = "wrapt-1.17.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8fc931382e56627ec4acb01e09ce66e5c03c384ca52606111cee50d931a342d"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8f8909cdb9f1b237786c09a810e24ee5e15ef17019f7cecb207ce205b9b5fcce"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad47b095f0bdc5585bced35bd088cbfe4177236c7df9984b3cc46b391cc60627"}, - {file = "wrapt-1.17.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:948a9bd0fb2c5120457b07e59c8d7210cbc8703243225dbd78f4dfc13c8d2d1f"}, - {file = "wrapt-1.17.0-cp38-cp38-win32.whl", hash = "sha256:5ae271862b2142f4bc687bdbfcc942e2473a89999a54231aa1c2c676e28f29ea"}, - {file = "wrapt-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:f335579a1b485c834849e9075191c9898e0731af45705c2ebf70e0cd5d58beed"}, - {file = "wrapt-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d751300b94e35b6016d4b1e7d0e7bbc3b5e1751e2405ef908316c2a9024008a1"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7264cbb4a18dc4acfd73b63e4bcfec9c9802614572025bdd44d0721983fc1d9c"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33539c6f5b96cf0b1105a0ff4cf5db9332e773bb521cc804a90e58dc49b10578"}, - {file = "wrapt-1.17.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c30970bdee1cad6a8da2044febd824ef6dc4cc0b19e39af3085c763fdec7de33"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bc7f729a72b16ee21795a943f85c6244971724819819a41ddbaeb691b2dd85ad"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:6ff02a91c4fc9b6a94e1c9c20f62ea06a7e375f42fe57587f004d1078ac86ca9"}, - {file = "wrapt-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2dfb7cff84e72e7bf975b06b4989477873dcf160b2fd89959c629535df53d4e0"}, - {file = "wrapt-1.17.0-cp39-cp39-win32.whl", hash = "sha256:2399408ac33ffd5b200480ee858baa58d77dd30e0dd0cab6a8a9547135f30a88"}, - {file = "wrapt-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:4f763a29ee6a20c529496a20a7bcb16a73de27f5da6a843249c7047daf135977"}, - {file = "wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371"}, - {file = "wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801"}, -] - -[[package]] -name = "yapf" -version = "0.43.0" -description = "A formatter for Python code" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yapf-0.43.0-py3-none-any.whl", hash = "sha256:224faffbc39c428cb095818cf6ef5511fdab6f7430a10783fdfb292ccf2852ca"}, - {file = "yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e"}, + {file = "wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a"}, + {file = "wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af"}, ] [package.dependencies] -platformdirs = ">=3.5.1" -tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} +bracex = ">=2.1.1" [metadata] -lock-version = "2.0" -python-versions = "^3.9" -content-hash = "5620752f915efa6f83198e7399d9893bbff1daa4c119a735b5535bbf5e3adf6b" +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "844a65b5fb8e287f2d379d765d473460352b3524b3a5ad2d8b4ef55ef1528eb2" diff --git a/packages/python-sdk/pyproject.toml b/packages/python-sdk/pyproject.toml index 7e92130..989b4be 100644 --- a/packages/python-sdk/pyproject.toml +++ b/packages/python-sdk/pyproject.toml @@ -1,28 +1,27 @@ [tool.poetry] name = "e2b-desktop" -version = "1.5.2" +version = "2.3.0" description = "E2B Desktop Sandbox - Deskstop sandbox in cloud powered by E2B" authors = ["e2b "] -license = "Apache-2.0" +license = "MIT" readme = "README.md" homepage = "https://e2b.dev/" repository = "https://github.com/e2b-dev/desktop/tree/main/packages/python-sdk" packages = [{ include = "e2b_desktop" }] [tool.poetry.dependencies] -python = "^3.9" +python = "^3.10" -e2b = "^1.0.4" +e2b = "^2.6.0" requests = "^2.32.3" -pillow = "^11.1.0" +pillow = "^12.0.0" [tool.poetry.group.dev.dependencies] pytest = "^7.4.0" python-dotenv = "^1.0.0" pytest-dotenv = "^0.5.2" pytest-xdist = "^3.6.1" -black = "23.12.1" -pydoc-markdown = "^4.8.2" +ruff = "^0.15.0" [build-system] requires = ["poetry-core"] @@ -30,3 +29,6 @@ build-backend = "poetry.core.masonry.api" [tool.poetry.urls] "Bug Tracker" = "https://github.com/e2b-dev/desktop/issues" + +[tool.ruff.lint] +ignore = ["F401", "F403"] diff --git a/packages/python-sdk/scripts/generate_sdk_ref.sh b/packages/python-sdk/scripts/generate_sdk_ref.sh deleted file mode 100755 index ad75279..0000000 --- a/packages/python-sdk/scripts/generate_sdk_ref.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# This script generates the python SDK reference markdown files -# Run it in the `python-sdk/` directory - -PKG_VERSION="v$(node -p "require('./package.json').version")" -ROUTES_DIR="../../sdk-reference/desktop-python-sdk/${PKG_VERSION}" -mkdir -p "${ROUTES_DIR}" - -mkdir -p sdk_ref - -package="e2b_desktop" - -# generate raw SDK reference markdown file -poetry run pydoc-markdown -p "${package}" >sdk_ref/"${package}".mdx -# remove package path display -sed -i'' -e '/]*>.*<\/a>/d' "sdk_ref/${package}.mdx" -# remove empty hyperlinks -sed -i'' -e '/^# /d' "sdk_ref/${package}.mdx" -# remove " Objects" from lines starting with "##" -sed -i'' -e '/^## / s/ Objects$//' "sdk_ref/${package}.mdx" -# replace lines starting with "####" with "###" -sed -i'' -e 's/^####/###/' "sdk_ref/${package}.mdx" -# move to docs -mkdir -p "${ROUTES_DIR}/sandbox" -mv "sdk_ref/${package}.mdx" "${ROUTES_DIR}/sandbox/page.mdx" - -rm -rf sdk_ref diff --git a/packages/python-sdk/tests/conftest.py b/packages/python-sdk/tests/conftest.py index bfa1b47..fdc0731 100644 --- a/packages/python-sdk/tests/conftest.py +++ b/packages/python-sdk/tests/conftest.py @@ -7,10 +7,11 @@ timeout = 60 logger = logging.getLogger(__name__) + @pytest.fixture(scope="function") def sandbox(debug): # Create a new sandbox instance for each test - sandbox = Sandbox(timeout=timeout) + sandbox = Sandbox.create(timeout=timeout) try: yield sandbox @@ -20,7 +21,9 @@ def sandbox(debug): sandbox.kill() except Exception as e: if not debug: - logger.warning(f"Failed to kill sandbox — this is expected if the test runs with local envd. Error: {e}") + logger.warning( + f"Failed to kill sandbox — this is expected if the test runs with local envd. Error: {e}" + ) @pytest.fixture @@ -34,4 +37,4 @@ def skip_by_debug(request, debug): # Skip test if E2B_DEBUG is set if request.node.get_closest_marker("skip_debug"): if debug: - pytest.skip("skipped because E2B_DEBUG is set") \ No newline at end of file + pytest.skip("skipped because E2B_DEBUG is set") diff --git a/packages/python-sdk/tests/test_controls.py b/packages/python-sdk/tests/test_controls.py index a4f97f4..ba7103d 100644 --- a/packages/python-sdk/tests/test_controls.py +++ b/packages/python-sdk/tests/test_controls.py @@ -1,45 +1,54 @@ -import os import time from e2b_desktop import Sandbox from PIL import ImageChops, Image import io + def crop_around_point(image, cursor_pos): x, y = cursor_pos box = (x - 50, y - 50, x + 50, y + 50) # 100x100 box return image.crop(box) + def images_are_equal(img1, img2): # Use ImageChops to find the difference diff = ImageChops.difference(img1, img2) # Check if there is any difference - return diff.getbbox() is None # Returns True if images are equal, False if different + return ( + diff.getbbox() is None + ) # Returns True if images are equal, False if different + def test_right_click(sandbox: Sandbox): # Capture the initial screenshot + time.sleep(5) # Wait for UI to load + initial_screenshot_bytes = sandbox.screenshot() initial_image = Image.open(io.BytesIO(initial_screenshot_bytes)) - + # Get cursor position and perform right click cursor_pos = sandbox.get_cursor_position() sandbox.right_click() time.sleep(5) # Wait for UI to respond - + # Capture and process the second screenshot post_click_screenshot_bytes = sandbox.screenshot() post_click_image = Image.open(io.BytesIO(post_click_screenshot_bytes)) - + # Crop both images around the cursor position cropped_image_1 = crop_around_point(initial_image, cursor_pos) cropped_image_2 = crop_around_point(post_click_image, cursor_pos) - + # Compare the cropped images - assert not images_are_equal(cropped_image_1, cropped_image_2), "The image around the cursor did not change after right-click." + assert not images_are_equal(cropped_image_1, cropped_image_2), ( + "The image around the cursor did not change after right-click." + ) + def test_screenshot(sandbox: Sandbox): image = sandbox.screenshot() assert image, "Screenshot was not taken successfully" - + # Check if the image is a valid image format try: img = Image.open(io.BytesIO(image)) @@ -47,14 +56,21 @@ def test_screenshot(sandbox: Sandbox): except Exception: assert False, "The screenshot is not a valid image." + def test_get_cursor_position(sandbox: Sandbox): pos = sandbox.get_cursor_position() - assert pos == (512, 384), f"Expected cursor position to be (512, 384), but got {pos}" + assert pos == ( + 512, + 384, + ), f"Expected cursor position to be (512, 384), but got {pos}" def test_get_screen_size(sandbox: Sandbox): size = sandbox.get_screen_size() - assert size == (1024, 768), f"Expected screen size to be (1024, 768), but got {size}" + assert size == ( + 1024, + 768, + ), f"Expected screen size to be (1024, 768), but got {size}" def test_write(sandbox: Sandbox): @@ -64,4 +80,6 @@ def test_write(sandbox: Sandbox): sandbox.open(text_file_path) # Add an assertion here, perhaps check if the content is correct content = sandbox.files.read(text_file_path) - assert content == "hello", f"Expected content 'hello' in {text_file_path}, but got {content}" \ No newline at end of file + assert content == "hello", ( + f"Expected content 'hello' in {text_file_path}, but got {content}" + ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41883c2..90f9f57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,131 +8,88 @@ importers: .: devDependencies: - '@changesets/cli': - specifier: ^2.26.2 - version: 2.28.1 '@changesets/read': - specifier: ^0.5.9 - version: 0.5.9 + specifier: ^0.6.5 + version: 0.6.7 + '@stylistic/eslint-plugin-ts': + specifier: ^1.6.2 + version: 1.8.1(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': + specifier: ^6.7.2 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: ^6.7.2 + version: 6.21.0(eslint@8.57.1)(typescript@5.9.3) changeset: specifier: ^0.2.6 version: 0.2.6 + eslint: + specifier: ^8.57.1 + version: 8.57.1 + eslint-plugin-unused-imports: + specifier: ^3.0.0 + version: 3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + prettier: + specifier: ^3.6.2 + version: 3.8.1 packages/js-sdk: dependencies: e2b: - specifier: ^1.0.7 - version: 1.0.7 + specifier: ^2.8.4 + version: 2.15.0 devDependencies: '@types/node': specifier: ^22.13.9 - version: 22.13.10 + version: 22.19.15 dotenv: specifier: ^16.4.5 - version: 16.4.7 + version: 16.6.1 tsup: specifier: ^8.3.5 - version: 8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + version: 8.5.1(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) tsx: specifier: ^4.19.2 - version: 4.19.3 - typedoc: - specifier: 0.26.8 - version: 0.26.8(typescript@5.8.2) - typedoc-plugin-markdown: - specifier: 4.2.7 - version: 4.2.7(typedoc@0.26.8(typescript@5.8.2)) + version: 4.21.0 typescript: specifier: ^5.6.3 - version: 5.8.2 + version: 5.9.3 vitest: specifier: ^3.0.5 - version: 3.0.8(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + version: 3.2.4(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2) packages/python-sdk: {} packages: - '@babel/runtime@7.26.9': - resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@2.2.3': - resolution: {integrity: sha512-tFQoXHJdkEOSwj5tRIZSPNUuXK3RaR7T1nUrPgbYX1pUbvqqaaZAsfo+NXBPsz5rZMSKVFrgK1WL8Q/MSLvprg==} - - '@changesets/apply-release-plan@7.0.10': - resolution: {integrity: sha512-wNyeIJ3yDsVspYvHnEz1xQDq18D9ifed3lI+wxRQRK4pArUcuHgCTrHv0QRnnwjhVCQACxZ+CBih3wgOct6UXw==} - - '@changesets/assemble-release-plan@6.0.6': - resolution: {integrity: sha512-Frkj8hWJ1FRZiY3kzVCKzS0N5mMwWKwmv9vpam7vt8rZjLL1JMthdh6pSDVSPumHPshTTkKZ0VtNbE0cJHZZUg==} - - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - - '@changesets/cli@2.28.1': - resolution: {integrity: sha512-PiIyGRmSc6JddQJe/W1hRPjiN4VrMvb2VfQ6Uydy2punBioQrsxppyG5WafinKcW1mT0jOe/wU4k9Zy5ff21AA==} - hasBin: true - - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} - - '@changesets/errors@0.1.4': - resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + '@bufbuild/protobuf@2.11.0': + resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - - '@changesets/get-release-plan@4.0.8': - resolution: {integrity: sha512-MM4mq2+DQU1ZT7nqxnpveDMTkMBLnwNX44cX7NSxlXmr7f8hO6/S2MXNiXG54uf/0nYnefv0cfy4Czf/ZL/EKQ==} - - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - - '@changesets/git@2.0.0': - resolution: {integrity: sha512-enUVEWbiqUTxqSnmesyJGWfzd51PY4H7mH9yUw0hPVpZBJ6tQZFMU3F3mT/t9OJ/GjyiM4770i+sehAn6ymx6A==} - - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} - - '@changesets/logger@0.0.5': - resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.3.16': - resolution: {integrity: sha512-127JKNd167ayAuBjUggZBkmDS5fIKsthnr9jr6bdnuUljroiERW7FBTDNnNVyJ4l69PzR57pk6mXQdtJyBCJKg==} - - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - - '@changesets/read@0.5.9': - resolution: {integrity: sha512-T8BJ6JS6j1gfO1HFq50kU3qawYxa4NTbI/ASNVVCBTsKquy2HYwM9r7ZnzkiMe8IEObAJtUVGSrePCOxAK2haQ==} - - '@changesets/read@0.6.3': - resolution: {integrity: sha512-9H4p/OuJ3jXEUTjaVGdQEhBdqoT2cO5Ts95JTFsQyawmKzpL8FnIeJSyhTDPW1MBRDnwZlHFEM9SpPwJDY5wIg==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@5.2.1': - resolution: {integrity: sha512-myLfHbVOqaq9UtUKqR/nZA/OY7xFjQMdfgfqeZIBK4d0hA6pgxArvdv8M+6NUzzBsjWLOtvApv8YHr4qM+Kpfg==} - '@changesets/types@6.1.0': resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@connectrpc/connect-web@2.0.0-rc.3': resolution: {integrity: sha512-w88P8Lsn5CCsA7MFRl2e6oLY4J/5toiNtJns/YJrlyQaWOy3RO8pDgkz+iIkG98RPMhj2thuBvsd3Cn4DKKCkw==} peerDependencies: @@ -144,177 +101,213 @@ packages: peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.27.3': + resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.27.3': + resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.27.3': + resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.27.3': + resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.27.3': + resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.27.3': + resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.27.3': + resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.27.3': + resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.27.3': + resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.27.3': + resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.27.3': + resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.27.3': + resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.27.3': + resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.27.3': + resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.27.3': + resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.27.3': + resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.27.3': + resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.27.3': + resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.27.3': + resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.27.3': + resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.27.3': + resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/openharmony-arm64@0.27.3': + resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.3': + resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.27.3': + resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.27.3': + resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.27.3': + resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.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/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@9.0.0': + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@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/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -334,200 +327,278 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rollup/rollup-android-arm-eabi@4.35.0': - resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.35.0': - resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.35.0': - resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.35.0': - resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.35.0': - resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.35.0': - resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.35.0': - resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.35.0': - resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.35.0': - resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.35.0': - resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.35.0': - resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': - resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.35.0': - resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.35.0': - resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.35.0': - resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.35.0': - resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.35.0': - resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.35.0': - resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.35.0': - resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@shikijs/core@1.29.2': - resolution: {integrity: sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==} - - '@shikijs/engine-javascript@1.29.2': - resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} - - '@shikijs/engine-oniguruma@1.29.2': - resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} + cpu: [x64] + os: [win32] - '@shikijs/langs@1.29.2': - resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} + '@stylistic/eslint-plugin-js@1.8.1': + resolution: {integrity: sha512-c5c2C8Mos5tTQd+NWpqwEu7VT6SSRooAguFPMj1cp2RkTYl1ynKoXo8MWy3k4rkbzoeYHrqC2UlUzsroAN7wtQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' - '@shikijs/themes@1.29.2': - resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} + '@stylistic/eslint-plugin-ts@1.8.1': + resolution: {integrity: sha512-/q1m+ZuO1JHfiSF16EATFzv7XSJkc5W6DocfvH5o9oB6WWYFMF77fVoBWnKT3wGptPOc2hkRupRKhmeFROdfWA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: '>=8.40.0' - '@shikijs/types@1.29.2': - resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.13.10': - resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/expect@3.0.8': - resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==} + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.0.8': - resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.0.8': - resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.0.8': - resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.0.8': - resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.0.8': - resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/utils@3.0.8': - resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 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@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -548,12 +619,23 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + brace-expansion@5.0.4: + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -569,57 +651,44 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@5.3.3: + resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} + engines: {node: '>=18'} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} changeset@0.2.6: resolution: {integrity: sha512-d21ym9zLPOKMVhIa8ulJo5IV3QR2NNdK6BWuwg48qJA0XSQaMeDjo1UGThcTn7YDmU08j3UpKyFNvb3zplk8mw==} - 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==} - - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} @@ -627,19 +696,31 @@ packages: compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -651,95 +732,132 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv@16.4.7: - resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + dockerfile-ast@0.7.1: + resolution: {integrity: sha512-oX/A4I0EhSkGqrFv0YuvPkBUSYp1XiY8O8zAKc8Djglx8ocz+JfOr8gP0ryRMC2myqvDLagmnZaU9ot1vG2ijw==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - e2b@1.0.7: - resolution: {integrity: sha512-7msagBbQ8tm51qaGp+hdaaaMjGG3zCzZtUS8bnz+LK7wdwtVTA1PmX+1Br9E3R7v6XIchnNWRpei+VjvGcfidA==} - engines: {node: '>=18'} + e2b@2.15.0: + resolution: {integrity: sha512-wjdrWBB/H9Lmo1vpJaCKlpcNjHKzztAL+/0q4gv8mpD96rrE4eh45kIxOMbGwb0vFXaDjjL2d93CYGAZDfKlPg==} + engines: {node: '>=20'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} + esbuild@0.27.3: + resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + engines: {node: '>=18'} + hasBin: true - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + eslint-plugin-unused-imports@3.2.0: + resolution: {integrity: sha512-6uXyn6xdINEpxE1MtDjxQsyXB37lfyO2yKGVVgtD7WEWQGORSOZjgrD6hBhvGv4/SO+TOlS+UnC6JppRqbuwGQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': 6 - 7 + eslint: '8' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + eslint-rule-composer@0.3.0: + resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} + engines: {node: '>=4.0.0'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + 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} - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} - engines: {node: '>=18'} + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.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-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - expect-type@1.2.0: - resolution: {integrity: sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - 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.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -748,6 +866,20 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} @@ -760,22 +892,39 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} 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] - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.13.6: + resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -783,39 +932,36 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} - hasBin: true + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + 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. - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 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-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -824,6 +970,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} @@ -835,20 +985,44 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@4.2.3: + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + engines: {node: 20 || >=22} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + hasBin: true + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 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-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -856,9 +1030,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - load-tsconfig@0.2.5: resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -867,71 +1038,52 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - - lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} - hasBin: true + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - mdast-util-to-hast@13.2.0: - resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + engines: {node: 20 || >=22} - mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@10.2.4: + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 20 || >=22} + + 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'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -939,30 +1091,30 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - oniguruma-to-es@2.3.0: - resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - openapi-fetch@0.9.8: - resolution: {integrity: sha512-zM6elH0EZStD/gSiNlcPrzXcVQ/pZo3BDvC6CDwRDUt1dDzxlshpmQnpD6cZaJ39THaSmwVCxxRrPKNM1hHrDg==} + openapi-fetch@0.14.1: + resolution: {integrity: sha512-l7RarRHxlEZYjMLd/PR0slfMVse2/vvIAGm75/F7J6MlQ8/b9uUQmUF2kCPrQhJqMXSxmYWObVgeYXbFYzZR+A==} - openapi-typescript-helpers@0.0.8: - resolution: {integrity: sha512-1eNjQtbfNi5Z/kFhagDIaIRj6qqDzhjNJKz8cmMW0CVdGwT6e1GLbAfgI0d28VTJa1A8jz82jm/4dG8qNoNS8g==} + openapi-typescript-helpers@0.0.15: + resolution: {integrity: sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} @@ -972,10 +1124,18 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + 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@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -987,20 +1147,25 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} 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-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -1009,8 +1174,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} picocolors@1.1.1: @@ -1020,18 +1185,21 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} 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==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} @@ -1053,32 +1221,23 @@ packages: yaml: optional: true - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} - - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} - punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} + prettier@3.8.1: + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + engines: {node: '>=14'} + hasBin: true punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - quansync@0.2.8: - resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -1090,17 +1249,9 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} - 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==} + 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==} @@ -1113,47 +1264,35 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.35.0: - resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@1.29.2: - resolution: {integrity: sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==} - 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'} @@ -1166,15 +1305,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -1185,45 +1318,40 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@3.8.1: - resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==} - - 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'} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} 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'} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@3.1.0: + resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} + + sucrase@3.35.1: + resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + tar@7.5.12: + resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} + engines: {node: '>=18'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -1237,45 +1365,41 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} 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==} + tinyspy@4.0.4: + resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - 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==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + tsup@8.5.1: + resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -1293,84 +1417,61 @@ packages: typescript: optional: true - tsx@4.19.3: - resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} hasBin: true - typedoc-plugin-markdown@4.2.7: - resolution: {integrity: sha512-bLsQdweSm48P9j6kGqQ3/4GCH5zu2EnURSkkxqirNc+uVFE9YK825ogDw+WbNkRHIV6eZK/1U43gT7YfglyYOg==} - engines: {node: '>= 18'} - peerDependencies: - typedoc: 0.26.x + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - typedoc@0.26.8: - resolution: {integrity: sha512-QBF0BMbnNeUc6U7pRHY7Jb8pjhmiNWZNQT8LU6uk9qP9t3goP9bJptdlNqMC0wBB2w9sQrxjZt835bpRSSq1LA==} - engines: {node: '>= 18'} - hasBin: true - peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} - typescript@5.8.2: - resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - udc@1.0.1: resolution: {integrity: sha512-jv+D9de1flsum5QkFtBdjyppCQAdz9kTck/0xST5Vx48T9LL2BYnw0Iw77dSKDQ9KZ/PS3qPO1vfXHDpLZlxcQ==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + underscore@1.13.7: resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - 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==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite-node@3.0.8: - resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.1: - resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -1398,16 +1499,16 @@ packages: yaml: optional: true - vitest@3.0.8: - resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} 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.8 - '@vitest/ui': 3.0.8 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1426,15 +1527,11 @@ packages: jsdom: optional: true - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} @@ -1446,140 +1543,37 @@ packages: engines: {node: '>=8'} hasBin: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} hasBin: true - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: - '@babel/runtime@7.26.9': - dependencies: - regenerator-runtime: 0.14.1 - - '@bufbuild/protobuf@2.2.3': {} - - '@changesets/apply-release-plan@7.0.10': - dependencies: - '@changesets/config': 3.1.1 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.1 - - '@changesets/assemble-release-plan@6.0.6': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.1 - - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.28.1': - dependencies: - '@changesets/apply-release-plan': 7.0.10 - '@changesets/assemble-release-plan': 6.0.6 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.8 - '@changesets/git': 3.0.2 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - ci-info: 3.9.0 - enquirer: 2.4.1 - external-editor: 3.1.0 - fs-extra: 7.0.1 - mri: 1.2.0 - p-limit: 2.3.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.1 - spawndamnit: 3.0.1 - term-size: 2.2.1 - - '@changesets/config@3.1.1': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + '@babel/runtime@7.28.6': {} - '@changesets/errors@0.1.4': - dependencies: - extendable-error: 0.1.7 + '@bufbuild/protobuf@2.11.0': {} '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.3': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.1 - - '@changesets/get-release-plan@4.0.8': - dependencies: - '@changesets/assemble-release-plan': 6.0.6 - '@changesets/config': 3.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.3 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - - '@changesets/get-version-range-type@0.4.0': {} - - '@changesets/git@2.0.0': - dependencies: - '@babel/runtime': 7.26.9 - '@changesets/errors': 0.1.4 - '@changesets/types': 5.2.1 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 2.0.0 - - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -1587,190 +1581,181 @@ snapshots: micromatch: 4.0.8 spawndamnit: 3.0.1 - '@changesets/logger@0.0.5': - dependencies: - chalk: 2.4.2 - '@changesets/logger@0.1.1': dependencies: picocolors: 1.1.1 - '@changesets/parse@0.3.16': - dependencies: - '@changesets/types': 5.2.1 - js-yaml: 3.14.1 - - '@changesets/parse@0.4.1': + '@changesets/parse@0.4.3': dependencies: '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + js-yaml: 4.1.1 - '@changesets/pre@2.0.2': + '@changesets/read@0.6.7': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - - '@changesets/read@0.5.9': - dependencies: - '@babel/runtime': 7.26.9 - '@changesets/git': 2.0.0 - '@changesets/logger': 0.0.5 - '@changesets/parse': 0.3.16 - '@changesets/types': 5.2.1 - chalk: 2.4.2 - fs-extra: 7.0.1 - p-filter: 2.1.0 - - '@changesets/read@0.6.3': - dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 + '@changesets/parse': 0.4.3 '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.2': - dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - '@changesets/types@4.1.0': {} - '@changesets/types@5.2.1': {} - '@changesets/types@6.1.0': {} - '@changesets/write@0.4.0': + '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0))': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.1 - prettier: 2.8.8 + '@bufbuild/protobuf': 2.11.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) - '@connectrpc/connect-web@2.0.0-rc.3(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.3))': + '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)': dependencies: - '@bufbuild/protobuf': 2.2.3 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.3) + '@bufbuild/protobuf': 2.11.0 - '@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.3)': - dependencies: - '@bufbuild/protobuf': 2.2.3 + '@esbuild/aix-ppc64@0.27.3': + optional: true - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/android-arm64@0.27.3': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm@0.27.3': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-x64@0.27.3': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/darwin-arm64@0.27.3': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-x64@0.27.3': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/freebsd-arm64@0.27.3': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-x64@0.27.3': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/linux-arm64@0.27.3': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm@0.27.3': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-ia32@0.27.3': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-loong64@0.27.3': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-mips64el@0.27.3': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-ppc64@0.27.3': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-riscv64@0.27.3': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-s390x@0.27.3': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-x64@0.27.3': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/netbsd-arm64@0.27.3': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-x64@0.27.3': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/openbsd-arm64@0.27.3': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-x64@0.27.3': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openharmony-arm64@0.27.3': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.27.3': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.27.3': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.27.3': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.27.3': optional: true - '@isaacs/cliui@8.0.2': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': 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 + ajv: 6.12.6 + debug: 4.4.1 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color - '@jridgewell/gen-mapping@0.3.8': + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color - '@jridgewell/resolve-uri@3.1.2': {} + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} - '@jridgewell/set-array@1.2.1': {} + '@isaacs/cliui@9.0.0': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.28.6 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.26.9 + '@babel/runtime': 7.28.6 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -1789,177 +1774,273 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@pkgjs/parseargs@0.11.0': + '@rollup/rollup-android-arm-eabi@4.57.1': optional: true - '@rollup/rollup-android-arm-eabi@4.35.0': + '@rollup/rollup-android-arm64@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.35.0': + '@rollup/rollup-darwin-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.35.0': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.35.0': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.35.0': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.35.0': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.35.0': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.35.0': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.35.0': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.35.0': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.35.0': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.35.0': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.35.0': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.35.0': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.35.0': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.35.0': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@shikijs/core@1.29.2': - dependencies: - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 + '@rollup/rollup-openharmony-arm64@4.57.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.57.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.57.1': + optional: true - '@shikijs/engine-javascript@1.29.2': + '@rollup/rollup-win32-x64-msvc@4.57.1': + optional: true + + '@stylistic/eslint-plugin-js@1.8.1(eslint@8.57.1)': dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 2.3.0 + '@types/eslint': 8.56.12 + acorn: 8.15.0 + escape-string-regexp: 4.0.0 + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 - '@shikijs/engine-oniguruma@1.29.2': + '@stylistic/eslint-plugin-ts@1.8.1(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 + '@stylistic/eslint-plugin-js': 1.8.1(eslint@8.57.1) + '@types/eslint': 8.56.12 + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript - '@shikijs/langs@1.29.2': + '@types/chai@5.2.3': dependencies: - '@shikijs/types': 1.29.2 + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - '@shikijs/themes@1.29.2': + '@types/deep-eql@4.0.2': {} + + '@types/eslint@8.56.12': dependencies: - '@shikijs/types': 1.29.2 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + + '@types/estree@1.0.8': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@12.20.55': {} - '@shikijs/types@1.29.2': + '@types/node@22.19.15': dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + undici-types: 6.21.0 - '@shikijs/vscode-textmate@10.0.2': {} + '@types/semver@7.7.0': {} - '@types/estree@1.0.6': {} + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@types/hast@3.0.4': + '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@types/unist': 3.0.3 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@types/mdast@4.0.4': + '@typescript-eslint/scope-manager@6.21.0': dependencies: - '@types/unist': 3.0.3 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 - '@types/node@12.20.55': {} + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.1 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.4.1 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@types/node@22.13.10': + '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - undici-types: 6.20.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) + eslint: 8.57.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript - '@types/unist@3.0.3': {} + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.3.0': {} - '@vitest/expect@3.0.8': + '@vitest/expect@3.2.4': dependencies: - '@vitest/spy': 3.0.8 - '@vitest/utils': 3.0.8 - chai: 5.2.0 + '@types/chai': 5.2.3 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 3.0.8 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/pretty-format@3.0.8': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.8': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.0.8 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.1.0 - '@vitest/snapshot@3.0.8': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.8 - magic-string: 0.30.17 + '@vitest/pretty-format': 3.2.4 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.0.8': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.4 - '@vitest/utils@3.0.8': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.0.8 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.2.1 tinyrainbow: 2.0.0 - ansi-colors@4.1.3: {} - - ansi-regex@5.0.1: {} + acorn-jsx@5.3.2(acorn@8.15.0): + dependencies: + acorn: 8.15.0 - ansi-regex@6.1.0: {} + acorn@8.15.0: {} - ansi-styles@3.2.1: + ajv@6.12.6: dependencies: - color-convert: 1.9.3 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - any-promise@1.3.0: {} argparse@1.0.10: @@ -1974,85 +2055,81 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - brace-expansion@2.0.1: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + brace-expansion@5.0.4: + dependencies: + balanced-match: 4.0.4 braces@3.0.3: dependencies: fill-range: 7.1.1 - bundle-require@5.1.0(esbuild@0.25.1): + bundle-require@5.1.0(esbuild@0.27.3): dependencies: - esbuild: 0.25.1 + esbuild: 0.27.3 load-tsconfig: 0.2.5 cac@6.7.14: {} - ccount@2.0.1: {} + callsites@3.1.0: {} - chai@5.2.0: + chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + loupe: 3.2.1 + pathval: 2.0.1 - chalk@2.4.2: + chalk@4.1.2: dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.6.2: {} changeset@0.2.6: dependencies: udc: 1.0.1 underscore: 1.13.7 - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - chardet@0.7.0: {} - - check-error@2.1.1: {} + check-error@2.1.3: {} chokidar@4.0.3: dependencies: readdirp: 4.1.2 - ci-info@3.9.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + chownr@3.0.0: {} color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} - comma-separated-tokens@2.0.3: {} - commander@4.1.1: {} compare-versions@6.1.1: {} - consola@3.4.0: {} + concat-map@0.0.1: {} - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + confbox@0.1.8: {} + + consola@3.4.2: {} cross-spawn@7.0.6: dependencies: @@ -2060,97 +2137,167 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - debug@4.4.0: + debug@4.4.1: + dependencies: + ms: 2.1.3 + + debug@4.4.3: dependencies: ms: 2.1.3 deep-eql@5.0.2: {} - dequal@2.0.3: {} + deep-is@0.1.4: {} - detect-indent@6.1.0: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 - devlop@1.1.0: + dockerfile-ast@0.7.1: dependencies: - dequal: 2.0.3 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 - dir-glob@3.0.1: + doctrine@3.0.0: dependencies: - path-type: 4.0.0 + esutils: 2.0.3 - dotenv@16.4.7: {} + dotenv@16.6.1: {} - e2b@1.0.7: + e2b@2.15.0: dependencies: - '@bufbuild/protobuf': 2.2.3 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.3) - '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.2.3)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.3)) + '@bufbuild/protobuf': 2.11.0 + '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0) + '@connectrpc/connect-web': 2.0.0-rc.3(@bufbuild/protobuf@2.11.0)(@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.11.0)) + chalk: 5.6.2 compare-versions: 6.1.1 - openapi-fetch: 0.9.8 + dockerfile-ast: 0.7.1 + glob: 11.1.0 + openapi-fetch: 0.14.1 platform: 1.3.6 + tar: 7.5.12 + + es-module-lexer@1.7.0: {} - eastasianwidth@0.2.0: {} + esbuild@0.27.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.3 + '@esbuild/android-arm': 0.27.3 + '@esbuild/android-arm64': 0.27.3 + '@esbuild/android-x64': 0.27.3 + '@esbuild/darwin-arm64': 0.27.3 + '@esbuild/darwin-x64': 0.27.3 + '@esbuild/freebsd-arm64': 0.27.3 + '@esbuild/freebsd-x64': 0.27.3 + '@esbuild/linux-arm': 0.27.3 + '@esbuild/linux-arm64': 0.27.3 + '@esbuild/linux-ia32': 0.27.3 + '@esbuild/linux-loong64': 0.27.3 + '@esbuild/linux-mips64el': 0.27.3 + '@esbuild/linux-ppc64': 0.27.3 + '@esbuild/linux-riscv64': 0.27.3 + '@esbuild/linux-s390x': 0.27.3 + '@esbuild/linux-x64': 0.27.3 + '@esbuild/netbsd-arm64': 0.27.3 + '@esbuild/netbsd-x64': 0.27.3 + '@esbuild/openbsd-arm64': 0.27.3 + '@esbuild/openbsd-x64': 0.27.3 + '@esbuild/openharmony-arm64': 0.27.3 + '@esbuild/sunos-x64': 0.27.3 + '@esbuild/win32-arm64': 0.27.3 + '@esbuild/win32-ia32': 0.27.3 + '@esbuild/win32-x64': 0.27.3 + + escape-string-regexp@4.0.0: {} + + eslint-plugin-unused-imports@3.2.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-rule-composer: 0.3.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - emoji-regex-xs@1.0.0: {} + eslint-rule-composer@0.3.0: {} - emoji-regex@8.0.0: {} + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 - emoji-regex@9.2.2: {} + eslint-visitor-keys@3.4.3: {} - enquirer@2.4.1: + eslint@8.57.1: dependencies: - ansi-colors: 4.1.3 + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.1 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color - entities@4.5.0: {} + espree@9.6.1: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 3.4.3 - es-module-lexer@1.6.0: {} + esprima@4.0.1: {} - esbuild@0.25.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 - - escape-string-regexp@1.0.5: {} + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 - esprima@4.0.1: {} + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 - expect-type@1.2.0: {} + esutils@2.0.3: {} + + expect-type@1.3.0: {} extendable-error@0.1.7: {} - 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: @@ -2160,13 +2307,21 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 fill-range@7.1.1: dependencies: @@ -2177,6 +2332,25 @@ snapshots: 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 + + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.21 + mlly: 1.8.0 + rollup: 4.57.1 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 @@ -2194,10 +2368,12 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true - get-tsconfig@4.10.0: + get-tsconfig@4.13.6: dependencies: resolve-pkg-maps: 1.0.0 @@ -2205,14 +2381,31 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 + jackspeak: 4.2.3 + minimatch: 10.2.4 + minipass: 7.1.3 package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 + path-scurry: 2.0.2 + + 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 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 globby@11.1.0: dependencies: @@ -2225,46 +2418,36 @@ snapshots: graceful-fs@4.2.11: {} - has-flag@3.0.0: {} + graphemer@1.4.0: {} - hast-util-to-html@9.0.5: - 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: 7.0.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 + has-flag@4.0.0: {} - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 + ignore@5.3.2: {} - html-void-elements@3.0.0: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 - human-id@4.1.1: {} + imurmurhash@0.1.4: {} - iconv-lite@0.4.24: + inflight@1.0.6: dependencies: - safer-buffer: 2.1.2 + once: 1.4.0 + wrappy: 1.0.2 - ignore@5.3.2: {} + inherits@2.0.4: {} is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} + is-path-inside@3.0.3: {} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -2273,110 +2456,97 @@ snapshots: isexe@2.0.0: {} - jackspeak@3.4.3: + jackspeak@4.2.3: dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + '@isaacs/cliui': 9.0.0 joycon@3.1.1: {} - js-yaml@3.14.1: + js-tokens@9.0.1: {} + + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} - linkify-it@5.0.0: - dependencies: - uc.micro: 2.1.0 - load-tsconfig@0.2.5: {} locate-path@5.0.0: dependencies: p-locate: 4.1.0 - lodash.sortby@4.7.0: {} - - lodash.startcase@4.4.0: {} - - loupe@3.1.3: {} - - lru-cache@10.4.3: {} - - lru-cache@4.1.5: + locate-path@6.0.0: dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 + p-locate: 5.0.0 - lunr@2.3.9: {} + lodash.merge@4.6.2: {} - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + loupe@3.2.1: {} - 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 + lru-cache@11.2.7: {} - mdast-util-to-hast@13.2.0: + magic-string@0.30.21: 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 - - mdurl@2.0.0: {} + '@jridgewell/sourcemap-codec': 1.5.5 merge2@1.4.1: {} - micromark-util-character@2.1.1: + micromatch@4.0.8: dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 + braces: 3.0.3 + picomatch: 2.3.1 - micromark-util-encode@2.0.1: {} + minimatch@10.2.4: + dependencies: + brace-expansion: 5.0.4 - micromark-util-sanitize-uri@2.0.1: + minimatch@3.1.2: dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 + brace-expansion: 1.1.12 - micromark-util-symbol@2.0.1: {} + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.2 - micromark-util-types@2.0.2: {} + minipass@7.1.3: {} - micromatch@4.0.8: + minizlib@3.1.0: dependencies: - braces: 3.0.3 - picomatch: 2.3.1 + minipass: 7.1.3 - minimatch@9.0.5: + mlly@1.8.0: dependencies: - brace-expansion: 2.0.1 - - minipass@7.1.2: {} - - mri@1.2.0: {} + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 ms@2.1.3: {} @@ -2386,25 +2556,30 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.9: {} + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} object-assign@4.1.1: {} - oniguruma-to-es@2.3.0: + once@1.4.0: dependencies: - emoji-regex-xs: 1.0.0 - regex: 5.1.1 - regex-recursion: 5.1.1 + wrappy: 1.0.2 - openapi-fetch@0.9.8: + openapi-fetch@0.14.1: dependencies: - openapi-typescript-helpers: 0.0.8 + openapi-typescript-helpers: 0.0.15 - openapi-typescript-helpers@0.0.8: {} + openapi-typescript-helpers@0.0.15: {} - os-tmpdir@1.0.2: {} - - outdent@0.5.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 p-filter@2.1.0: dependencies: @@ -2414,96 +2589,95 @@ snapshots: dependencies: p-try: 2.2.0 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-map@2.1.0: {} p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.11: + parent-module@1.0.1: dependencies: - quansync: 0.2.8 + callsites: 3.1.0 path-exists@4.0.0: {} + path-is-absolute@1.0.1: {} + path-key@3.1.1: {} - path-scurry@1.11.1: + path-scurry@2.0.2: dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + lru-cache: 11.2.7 + minipass: 7.1.3 path-type@4.0.0: {} pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pify@4.0.1: {} - pirates@4.0.6: {} + pirates@4.0.7: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.0 + pathe: 2.0.3 platform@1.3.6: {} - postcss-load-config@6.0.1(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0): + postcss-load-config@6.0.1(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.5.3 - tsx: 4.19.3 - yaml: 2.7.0 + postcss: 8.5.6 + tsx: 4.21.0 + yaml: 2.8.2 - postcss@8.5.3: + postcss@8.5.6: dependencies: - nanoid: 3.3.9 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@2.8.8: {} - - property-information@7.0.0: {} + prelude-ls@1.2.1: {} - pseudomap@1.0.2: {} - - punycode.js@2.3.1: {} + prettier@3.8.1: {} punycode@2.3.1: {} - quansync@0.2.8: {} - queue-microtask@1.2.3: {} read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 readdirp@4.1.2: {} - 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 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -2511,82 +2685,62 @@ snapshots: reusify@1.1.0: {} - rollup@4.35.0: + rimraf@3.0.2: dependencies: - '@types/estree': 1.0.6 + glob: 7.2.3 + + rollup@4.57.1: + dependencies: + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.35.0 - '@rollup/rollup-android-arm64': 4.35.0 - '@rollup/rollup-darwin-arm64': 4.35.0 - '@rollup/rollup-darwin-x64': 4.35.0 - '@rollup/rollup-freebsd-arm64': 4.35.0 - '@rollup/rollup-freebsd-x64': 4.35.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 - '@rollup/rollup-linux-arm-musleabihf': 4.35.0 - '@rollup/rollup-linux-arm64-gnu': 4.35.0 - '@rollup/rollup-linux-arm64-musl': 4.35.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 - '@rollup/rollup-linux-riscv64-gnu': 4.35.0 - '@rollup/rollup-linux-s390x-gnu': 4.35.0 - '@rollup/rollup-linux-x64-gnu': 4.35.0 - '@rollup/rollup-linux-x64-musl': 4.35.0 - '@rollup/rollup-win32-arm64-msvc': 4.35.0 - '@rollup/rollup-win32-ia32-msvc': 4.35.0 - '@rollup/rollup-win32-x64-msvc': 4.35.0 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safer-buffer@2.1.2: {} - - semver@7.7.1: {} - - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 + semver@7.7.2: {} shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} - shiki@1.29.2: - dependencies: - '@shikijs/core': 1.29.2 - '@shikijs/engine-javascript': 1.29.2 - '@shikijs/engine-oniguruma': 1.29.2 - '@shikijs/langs': 1.29.2 - '@shikijs/themes': 1.29.2 - '@shikijs/types': 1.29.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} slash@3.0.0: {} source-map-js@1.2.1: {} - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 - - space-separated-tokens@2.0.2: {} - - spawndamnit@2.0.0: - dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + source-map@0.7.6: {} spawndamnit@3.0.1: dependencies: @@ -2597,50 +2751,43 @@ snapshots: stackback@0.0.2: {} - std-env@3.8.1: {} - - 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 - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 + std-env@3.10.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: {} - sucrase@3.35.0: + strip-json-comments@3.1.1: {} + + strip-literal@3.1.0: + dependencies: + js-tokens: 9.0.1 + + sucrase@3.35.1: dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 - glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 + tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 - supports-color@5.5.0: + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tar@7.5.12: dependencies: - has-flag: 3.0.0 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 - term-size@2.2.1: {} + text-table@0.2.0: {} thenify-all@1.6.0: dependencies: @@ -2654,134 +2801,93 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: + tinyglobby@0.2.15: dependencies: - fdir: 6.4.3(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} - - tmp@0.0.33: - dependencies: - os-tmpdir: 1.0.2 + tinyspy@4.0.4: {} to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} - trim-lines@3.0.1: {} + ts-api-utils@1.4.3(typescript@5.9.3): + dependencies: + typescript: 5.9.3 ts-interface-checker@0.1.13: {} - tsup@8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): + tsup@8.5.1(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2): dependencies: - bundle-require: 5.1.0(esbuild@0.25.1) + bundle-require: 5.1.0(esbuild@0.27.3) cac: 6.7.14 chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.25.1 + consola: 3.4.2 + debug: 4.4.3 + esbuild: 0.27.3 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0) + postcss-load-config: 6.0.1(postcss@8.5.6)(tsx@4.21.0)(yaml@2.8.2) resolve-from: 5.0.0 - rollup: 4.35.0 - source-map: 0.8.0-beta.0 - sucrase: 3.35.0 + rollup: 4.57.1 + source-map: 0.7.6 + sucrase: 3.35.1 tinyexec: 0.3.2 - tinyglobby: 0.2.12 + tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.3 - typescript: 5.8.2 + postcss: 8.5.6 + typescript: 5.9.3 transitivePeerDependencies: - jiti - supports-color - tsx - yaml - tsx@4.19.3: + tsx@4.21.0: dependencies: - esbuild: 0.25.1 - get-tsconfig: 4.10.0 + esbuild: 0.27.3 + get-tsconfig: 4.13.6 optionalDependencies: fsevents: 2.3.3 - typedoc-plugin-markdown@4.2.7(typedoc@0.26.8(typescript@5.8.2)): - dependencies: - typedoc: 0.26.8(typescript@5.8.2) - - typedoc@0.26.8(typescript@5.8.2): + type-check@0.4.0: dependencies: - lunr: 2.3.9 - markdown-it: 14.1.0 - minimatch: 9.0.5 - shiki: 1.29.2 - typescript: 5.8.2 - yaml: 2.7.0 + prelude-ls: 1.2.1 - typescript@5.8.2: {} + type-fest@0.20.2: {} - uc.micro@2.1.0: {} + typescript@5.9.3: {} udc@1.0.1: {} - underscore@1.13.7: {} - - undici-types@6.20.0: {} + ufo@1.6.3: {} - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.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 + underscore@1.13.7: {} - 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 + undici-types@6.21.0: {} universalify@0.1.2: {} - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: + uri-js@4.4.1: dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.2 + punycode: 2.3.1 - vite-node@3.0.8(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): + vite-node@3.2.4(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.3 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -2796,41 +2902,47 @@ snapshots: - tsx - yaml - vite@6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): + vite@7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.1 - postcss: 8.5.3 - rollup: 4.35.0 + esbuild: 0.27.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.57.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.13.10 + '@types/node': 22.19.15 fsevents: 2.3.3 - tsx: 4.19.3 - yaml: 2.7.0 - - vitest@3.0.8(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0): - dependencies: - '@vitest/expect': 3.0.8 - '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.8 - '@vitest/runner': 3.0.8 - '@vitest/snapshot': 3.0.8 - '@vitest/spy': 3.0.8 - '@vitest/utils': 3.0.8 - chai: 5.2.0 - debug: 4.4.0 - expect-type: 1.2.0 - magic-string: 0.30.17 + tsx: 4.21.0 + yaml: 2.8.2 + + vitest@3.2.4(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3 + expect-type: 1.3.0 + magic-string: 0.30.21 pathe: 2.0.3 - std-env: 3.8.1 + picomatch: 4.0.3 + std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinypool: 1.0.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.2.1(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) - vite-node: 3.0.8(@types/node@22.13.10)(tsx@4.19.3)(yaml@2.7.0) + vite: 7.3.1(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.15)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.13.10 + '@types/node': 22.19.15 transitivePeerDependencies: - jiti - less @@ -2845,17 +2957,9 @@ snapshots: - tsx - yaml - webidl-conversions@4.0.2: {} - - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 + vscode-languageserver-textdocument@1.0.12: {} - which@1.3.1: - dependencies: - isexe: 2.0.0 + vscode-languageserver-types@3.17.5: {} which@2.0.2: dependencies: @@ -2866,20 +2970,13 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 + word-wrap@1.2.5: {} - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + wrappy@1.0.2: {} - yallist@2.1.2: {} + yallist@5.0.0: {} - yaml@2.7.0: {} + yaml@2.8.2: + optional: true - zwitch@2.0.4: {} + yocto-queue@0.1.0: {} diff --git a/renovate.json5 b/renovate.json5 new file mode 100644 index 0000000..616f7b6 --- /dev/null +++ b/renovate.json5 @@ -0,0 +1,36 @@ +// configuration options: https://docs.renovatebot.com/configuration-options/ +// list of all presets: https://docs.renovatebot.com/presets-default/ +{ + $schema: 'https://docs.renovatebot.com/renovate-schema.json', + extends: ['config:recommended', ':automergeRequireAllStatusChecks'], + dependencyDashboard: true, + // let it fly for now, we've got a lot to catch up on + // schedule: [ + // "0 * * * *" + // ], + timezone: 'UTC', + // Always squash PRs when automerging + automergeType: 'pr', + automergeStrategy: 'squash', + packageRules: [ + { + description: 'Group and automerge patch updates after CI passes', + matchUpdateTypes: ['patch'], + automerge: true, + groupName: 'patch-updates', + }, + { + description: 'Create PRs for minor updates without automerge', + matchUpdateTypes: ['minor'], + automerge: false, + }, + { + description: 'Require dashboard approval for major updates', + matchUpdateTypes: ['major'], + dependencyDashboardApproval: true, + automerge: false, + }, + ], + prConcurrentLimit: 3, + rebaseWhen: 'auto', +} diff --git a/sdk-reference/desktop-js-sdk/v1.0.1/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.0.1/sandbox/page.mdx deleted file mode 100644 index 85ea6d8..0000000 --- a/sdk-reference/desktop-js-sdk/v1.0.1/sandbox/page.mdx +++ /dev/null @@ -1,414 +0,0 @@ -### Sandbox - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current mouse position. - -###### Returns - -`Promise`\<`object`\> - -An object with `x` and `y` coordinates. - -| Name | Type | -| ------ | ------ | -| `x` | `number` | -| `y` | `number` | - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`object`\> - -An object with `width` and `height` properties. - -| Name | Type | -| ------ | ------ | -| `height` | `number` | -| `width` | `number` | - -### getVideoStreamUrl() - -```ts -getVideoStreamUrl(): Promise -``` - -###### Returns - -`Promise`\<`string`\> - -### hotkey() - -```ts -hotkey(...keys: string[]): Promise -``` - -Press a hotkey. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| ...`keys` | `string`[] | The keys to press (e.g. `hotkey("ctrl", "c")` will press Ctrl+C). | - -###### Returns - -`Promise`\<`CommandResult`\> - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. -Note that you'll need to wait for the application to be opened. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`CommandHandle`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`CommandResult`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### runPyautoguiCode() - -```ts -runPyautoguiCode(code: string, opts: object): Promise -``` - -Run the given Python code that uses pyautogui. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `code` | `string` | -| `opts` | `object` | -| `opts.onStderr`? | (`data`: `string`) => `void` | -| `opts.onStdout`? | (`data`: `string`) => `void` | - -###### Returns - -`Promise`\<`CommandResult`\> - -### scroll() - -```ts -scroll(amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `amount` | `number` | The amount to scroll. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### takeScreenshot() - -###### takeScreenshot() - -```ts -takeScreenshot(): Promise -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\> - -A Uint8Array bytes representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "bytes"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\> - -A Uint8Array bytes representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "stream"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\>\> - -A ReadableStream of bytes representation of the screenshot. - -### write() - -```ts -write(text: string): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -#### Properties - -### onVideoStreamStart()? - -```ts -optional onVideoStreamStart: (url: string) => void; -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `url` | `string` | - -###### Returns - -`void` - -### videoStream? - -```ts -optional videoStream: boolean; -``` diff --git a/sdk-reference/desktop-js-sdk/v1.0.2/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.0.2/sandbox/page.mdx deleted file mode 100644 index 85ea6d8..0000000 --- a/sdk-reference/desktop-js-sdk/v1.0.2/sandbox/page.mdx +++ /dev/null @@ -1,414 +0,0 @@ -### Sandbox - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current mouse position. - -###### Returns - -`Promise`\<`object`\> - -An object with `x` and `y` coordinates. - -| Name | Type | -| ------ | ------ | -| `x` | `number` | -| `y` | `number` | - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`object`\> - -An object with `width` and `height` properties. - -| Name | Type | -| ------ | ------ | -| `height` | `number` | -| `width` | `number` | - -### getVideoStreamUrl() - -```ts -getVideoStreamUrl(): Promise -``` - -###### Returns - -`Promise`\<`string`\> - -### hotkey() - -```ts -hotkey(...keys: string[]): Promise -``` - -Press a hotkey. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| ...`keys` | `string`[] | The keys to press (e.g. `hotkey("ctrl", "c")` will press Ctrl+C). | - -###### Returns - -`Promise`\<`CommandResult`\> - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. -Note that you'll need to wait for the application to be opened. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`CommandHandle`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`CommandResult`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`CommandResult`\> - -### runPyautoguiCode() - -```ts -runPyautoguiCode(code: string, opts: object): Promise -``` - -Run the given Python code that uses pyautogui. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `code` | `string` | -| `opts` | `object` | -| `opts.onStderr`? | (`data`: `string`) => `void` | -| `opts.onStdout`? | (`data`: `string`) => `void` | - -###### Returns - -`Promise`\<`CommandResult`\> - -### scroll() - -```ts -scroll(amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `amount` | `number` | The amount to scroll. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### takeScreenshot() - -###### takeScreenshot() - -```ts -takeScreenshot(): Promise -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\> - -A Uint8Array bytes representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "bytes"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\> - -A Uint8Array bytes representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### takeScreenshot(format) - -```ts -takeScreenshot(format: "stream"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\>\> - -A ReadableStream of bytes representation of the screenshot. - -### write() - -```ts -write(text: string): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | - -###### Returns - -`Promise`\<`CommandResult`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -#### Properties - -### onVideoStreamStart()? - -```ts -optional onVideoStreamStart: (url: string) => void; -``` - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `url` | `string` | - -###### Returns - -`void` - -### videoStream? - -```ts -optional videoStream: boolean; -``` diff --git a/sdk-reference/desktop-js-sdk/v1.0.3/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.0.3/sandbox/page.mdx deleted file mode 100644 index cc99701..0000000 --- a/sdk-reference/desktop-js-sdk/v1.0.3/sandbox/page.mdx +++ /dev/null @@ -1,433 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`null` \| `CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`null` \| `ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### Call Signature - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | \{ `chunkSize`: `number`; `delayInMs`: `number`; \} | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### Call Signature - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -``` - -###### Call Signature - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -``` - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### enableAuth? - -```ts -optional enableAuth: boolean; -``` - -Whether to enable authentication for noVNC connections. - -### port? - -```ts -optional port: number; -``` - -Port number for the noVNC proxy server. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. - -### vncPort? - -```ts -optional vncPort: number; -``` - -Port number for the VNC server. diff --git a/sdk-reference/desktop-js-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.1.1/sandbox/page.mdx deleted file mode 100644 index cc99701..0000000 --- a/sdk-reference/desktop-js-sdk/v1.1.1/sandbox/page.mdx +++ /dev/null @@ -1,433 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`null` \| `CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`null` \| `ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### Call Signature - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | \{ `chunkSize`: `number`; `delayInMs`: `number`; \} | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### Call Signature - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -``` - -###### Call Signature - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -``` - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### enableAuth? - -```ts -optional enableAuth: boolean; -``` - -Whether to enable authentication for noVNC connections. - -### port? - -```ts -optional port: number; -``` - -Port number for the noVNC proxy server. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. - -### vncPort? - -```ts -optional vncPort: number; -``` - -Port number for the VNC server. diff --git a/sdk-reference/desktop-js-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.2.0/sandbox/page.mdx deleted file mode 100644 index 50a03ff..0000000 --- a/sdk-reference/desktop-js-sdk/v1.2.0/sandbox/page.mdx +++ /dev/null @@ -1,433 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### Call Signature - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | \{ `chunkSize`: `number`; `delayInMs`: `number`; \} | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### Call Signature - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -``` - -###### Call Signature - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -``` - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### enableAuth? - -```ts -optional enableAuth: boolean; -``` - -Whether to enable authentication for noVNC connections. - -### port? - -```ts -optional port: number; -``` - -Port number for the noVNC proxy server. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. - -### vncPort? - -```ts -optional vncPort: number; -``` - -Port number for the VNC server. diff --git a/sdk-reference/desktop-js-sdk/v1.3.0/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.3.0/sandbox/page.mdx deleted file mode 100644 index e175eaa..0000000 --- a/sdk-reference/desktop-js-sdk/v1.3.0/sandbox/page.mdx +++ /dev/null @@ -1,409 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` | The key to press (e.g. "enter", "space", "backspace", etc.). | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### Call Signature - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### Call Signature - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | \{ `chunkSize`: `number`; `delayInMs`: `number`; \} | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### Call Signature - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -``` - -###### Call Signature - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -``` - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-js-sdk/v1.4.0/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.4.0/sandbox/page.mdx deleted file mode 100644 index 11d00ed..0000000 --- a/sdk-reference/desktop-js-sdk/v1.4.0/sandbox/page.mdx +++ /dev/null @@ -1,442 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### drag() - -```ts -drag(from: [number, number], to: [number, number]): Promise -``` - -Drag the mouse from the given position to the given position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `from` | [`number`, `number`] | The starting position. | -| `to` | [`number`, `number`] | The ending position. | - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string | string[]): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` \| `string`[] | The key to press (e.g. "enter", "space", "backspace", etc.). Can be a single key or an array of keys. | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### screenshot() - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### wait() - -```ts -wait(ms: number): Promise -``` - -Wait for the given amount of time. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `ms` | `number` | The amount of time to wait in milliseconds. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | `object` | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-js-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.5.0/sandbox/page.mdx deleted file mode 100644 index 1510572..0000000 --- a/sdk-reference/desktop-js-sdk/v1.5.0/sandbox/page.mdx +++ /dev/null @@ -1,478 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### drag() - -```ts -drag(from: [number, number], to: [number, number]): Promise -``` - -Drag the mouse from the given position to the given position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `from` | [`number`, `number`] | The starting position. | -| `to` | [`number`, `number`] | The ending position. | - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### mousePress() - -```ts -mousePress(button: "left" | "right" | "middle"): Promise -``` - -Press the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### mouseRelease() - -```ts -mouseRelease(button: "left" | "right" | "middle"): Promise -``` - -Release the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string | string[]): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` \| `string`[] | The key to press (e.g. "enter", "space", "backspace", etc.). Can be a single key or an array of keys. | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### screenshot() - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### wait() - -```ts -wait(ms: number): Promise -``` - -Wait for the given amount of time. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `ms` | `number` | The amount of time to wait in milliseconds. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | `object` | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-js-sdk/v1.6.0/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.6.0/sandbox/page.mdx deleted file mode 100644 index 1510572..0000000 --- a/sdk-reference/desktop-js-sdk/v1.6.0/sandbox/page.mdx +++ /dev/null @@ -1,478 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### drag() - -```ts -drag(from: [number, number], to: [number, number]): Promise -``` - -Drag the mouse from the given position to the given position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `from` | [`number`, `number`] | The starting position. | -| `to` | [`number`, `number`] | The ending position. | - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### mousePress() - -```ts -mousePress(button: "left" | "right" | "middle"): Promise -``` - -Press the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### mouseRelease() - -```ts -mouseRelease(button: "left" | "right" | "middle"): Promise -``` - -Release the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string | string[]): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` \| `string`[] | The key to press (e.g. "enter", "space", "backspace", etc.). Can be a single key or an array of keys. | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### screenshot() - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "up" | "down", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"up"` \| `"down"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### wait() - -```ts -wait(ms: number): Promise -``` - -Wait for the given amount of time. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `ms` | `number` | The amount of time to wait in milliseconds. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | `object` | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-js-sdk/v1.6.1/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.6.1/sandbox/page.mdx deleted file mode 100644 index 992eab1..0000000 --- a/sdk-reference/desktop-js-sdk/v1.6.1/sandbox/page.mdx +++ /dev/null @@ -1,478 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(): Promise -``` - -Double left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### drag() - -```ts -drag(from: [number, number], to: [number, number]): Promise -``` - -Drag the mouse from the given position to the given position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `from` | [`number`, `number`] | The starting position. | -| `to` | [`number`, `number`] | The ending position. | - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(): Promise -``` - -Left click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(): Promise -``` - -Middle click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### mousePress() - -```ts -mousePress(button: "left" | "right" | "middle"): Promise -``` - -Press the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### mouseRelease() - -```ts -mouseRelease(button: "left" | "right" | "middle"): Promise -``` - -Release the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string | string[]): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` \| `string`[] | The key to press (e.g. "enter", "space", "backspace", etc.). Can be a single key or an array of keys. | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(): Promise -``` - -Right click on the current mouse position. - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### screenshot() - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "down" | "up", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"down"` \| `"up"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### wait() - -```ts -wait(ms: number): Promise -``` - -Wait for the given amount of time. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `ms` | `number` | The amount of time to wait in milliseconds. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | `object` | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-js-sdk/v1.6.2/sandbox/page.mdx b/sdk-reference/desktop-js-sdk/v1.6.2/sandbox/page.mdx deleted file mode 100644 index 32ae251..0000000 --- a/sdk-reference/desktop-js-sdk/v1.6.2/sandbox/page.mdx +++ /dev/null @@ -1,506 +0,0 @@ -### Sandbox - -#### Properties - -| Property | Modifier | Type | -| ------ | ------ | ------ | -| `display` | `readonly` | `string` | -| `stream` | `readonly` | `VNCServer` | - -#### Methods - -### doubleClick() - -```ts -doubleClick(x?: number, y?: number): Promise -``` - -Double left click on the mouse position. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `x`? | `number` | -| `y`? | `number` | - -###### Returns - -`Promise`\<`void`\> - -### drag() - -```ts -drag(from: [number, number], to: [number, number]): Promise -``` - -Drag the mouse from the given position to the given position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `from` | [`number`, `number`] | The starting position. | -| `to` | [`number`, `number`] | The ending position. | - -###### Returns - -`Promise`\<`void`\> - -### getCursorPosition() - -```ts -getCursorPosition(): Promise -``` - -Get the current cursor position. - -###### Returns - -`Promise`\<`CursorPosition`\> - -A object with the x and y coordinates - -###### Throws - -Error if cursor position cannot be determined - -### getScreenSize() - -```ts -getScreenSize(): Promise -``` - -Get the current screen size. - -###### Returns - -`Promise`\<`ScreenSize`\> - -An ScreenSize object - -###### Throws - -Error if screen size cannot be determined - -### leftClick() - -```ts -leftClick(x?: number, y?: number): Promise -``` - -Left click on the mouse position. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `x`? | `number` | -| `y`? | `number` | - -###### Returns - -`Promise`\<`void`\> - -### middleClick() - -```ts -middleClick(x?: number, y?: number): Promise -``` - -Middle click on the mouse position. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `x`? | `number` | -| `y`? | `number` | - -###### Returns - -`Promise`\<`void`\> - -### mousePress() - -```ts -mousePress(button: "left" | "right" | "middle"): Promise -``` - -Press the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### mouseRelease() - -```ts -mouseRelease(button: "left" | "right" | "middle"): Promise -``` - -Release the mouse button. - -###### Parameters - -| Parameter | Type | Default value | -| ------ | ------ | ------ | -| `button` | `"left"` \| `"right"` \| `"middle"` | `'left'` | - -###### Returns - -`Promise`\<`void`\> - -### moveMouse() - -```ts -moveMouse(x: number, y: number): Promise -``` - -Move the mouse to the given coordinates. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `x` | `number` | The x coordinate. | -| `y` | `number` | The y coordinate. | - -###### Returns - -`Promise`\<`void`\> - -### open() - -```ts -open(fileOrUrl: string): Promise -``` - -Open a file or a URL in the default application. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `fileOrUrl` | `string` | The file or URL to open. | - -###### Returns - -`Promise`\<`void`\> - -### press() - -```ts -press(key: string | string[]): Promise -``` - -Press a key. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `key` | `string` \| `string`[] | The key to press (e.g. "enter", "space", "backspace", etc.). Can be a single key or an array of keys. | - -###### Returns - -`Promise`\<`void`\> - -### rightClick() - -```ts -rightClick(x?: number, y?: number): Promise -``` - -Right click on the mouse position. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `x`? | `number` | -| `y`? | `number` | - -###### Returns - -`Promise`\<`void`\> - -### screenshot() - -###### screenshot() - -```ts -screenshot(): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "bytes"): Promise> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `format` | `"bytes"` | The format of the screenshot. | - -###### Returns - -`Promise`\<`Uint8Array`\<`ArrayBufferLike`\>\> - -A Uint8Array bytes representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "blob"): Promise -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"blob"` | - -###### Returns - -`Promise`\<`Blob`\> - -A Blob representation of the screenshot. - -###### screenshot(format) - -```ts -screenshot(format: "stream"): Promise>> -``` - -Take a screenshot and save it to the given name. - -###### Parameters - -| Parameter | Type | -| ------ | ------ | -| `format` | `"stream"` | - -###### Returns - -`Promise`\<`ReadableStream`\<`Uint8Array`\<`ArrayBufferLike`\>\>\> - -A ReadableStream of bytes representation of the screenshot. - -### scroll() - -```ts -scroll(direction: "down" | "up", amount: number): Promise -``` - -Scroll the mouse wheel by the given amount. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `direction` | `"down"` \| `"up"` | `'down'` | The direction to scroll. Can be "up" or "down". | -| `amount` | `number` | `1` | The amount to scroll. | - -###### Returns - -`Promise`\<`void`\> - -### wait() - -```ts -wait(ms: number): Promise -``` - -Wait for the given amount of time. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `ms` | `number` | The amount of time to wait in milliseconds. | - -###### Returns - -`Promise`\<`void`\> - -### waitAndVerify() - -```ts -waitAndVerify( - cmd: string, - onResult: (result: CommandResult) => boolean, - timeout: number, -interval: number): Promise -``` - -Wait for a command to return a specific result. - -###### Parameters - -| Parameter | Type | Default value | Description | -| ------ | ------ | ------ | ------ | -| `cmd` | `string` | `undefined` | The command to run. | -| `onResult` | (`result`: `CommandResult`) => `boolean` | `undefined` | The function to check the result of the command. | -| `timeout` | `number` | `10` | The maximum time to wait for the command to return the result. | -| `interval` | `number` | `0.5` | The interval to wait between checks. | - -###### Returns - -`Promise`\<`boolean`\> - -`true` if the command returned the result within the timeout, otherwise `false`. - -### write() - -```ts -write(text: string, options: object): Promise -``` - -Write the given text at the current cursor position. - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `text` | `string` | The text to write. | -| `options` | `object` | An object containing the chunk size and delay between each chunk of text. | -| `options.chunkSize` | `number` | The size of each chunk of text to write. Default is 25 characters. | -| `options.delayInMs` | `number` | The delay between each chunk of text. Default is 75 ms. | - -###### Returns - -`Promise`\<`void`\> - -### create() - -###### create(this, opts) - -```ts -static create(this: S, opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the default `desktop` sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create() -``` - -###### Constructs - -Sandbox - -###### create(this, template, opts) - -```ts -static create( - this: S, - template: string, -opts?: SandboxOpts): Promise> -``` - -Create a new sandbox from the specified sandbox template. - -###### Type Parameters - -| Type Parameter | -| ------ | -| `S` *extends* *typeof* `Sandbox` | - -###### Parameters - -| Parameter | Type | Description | -| ------ | ------ | ------ | -| `this` | `S` | - | -| `template` | `string` | sandbox template name or ID. | -| `opts`? | `SandboxOpts` | connection options. | - -###### Returns - -`Promise`\<`InstanceType`\<`S`\>\> - -sandbox instance for the new sandbox. - -###### Example - -```ts -const sandbox = await Sandbox.create('') -``` - -###### Constructs - -Sandbox - -## Interfaces - -### SandboxOpts - -Configuration options for the Sandbox environment. - SandboxOpts - -#### Properties - -### display? - -```ts -optional display: string; -``` - -Display identifier. - -### dpi? - -```ts -optional dpi: number; -``` - -Dots per inch (DPI) setting for the display. - -### resolution? - -```ts -optional resolution: [number, number]; -``` - -The screen resolution in pixels, specified as [width, height]. diff --git a/sdk-reference/desktop-python-sdk/v1.0.1/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.0.1/sandbox/page.mdx deleted file mode 100644 index 7d61166..0000000 --- a/sdk-reference/desktop-python-sdk/v1.0.1/sandbox/page.mdx +++ /dev/null @@ -1,198 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### get\_video\_stream\_url - -```python -def get_video_stream_url() -``` - -Get the video stream URL. - - -### take\_screenshot - -```python -@overload -def take_screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### take\_screenshot - -```python -@overload -def take_screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### take\_screenshot - -```python -def take_screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(amount: int) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -``` - -Get the current cursor position. - -**Returns**: - -A tuple with the x and y coordinates. - - -### get\_screen\_size - -```python -def get_screen_size() -``` - -Get the current screen size. - -**Returns**: - -A tuple with the width and height. - - -### write - -```python -def write(text: str) -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. - - -### press - -```python -def press(key: str) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### hotkey - -```python -def hotkey(*keys) -``` - -Press a hotkey. - -**Arguments**: - -- `keys`: The keys to press (e.g. `hotkey("ctrl", "c")` will press Ctrl+C). - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.0.2/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.0.2/sandbox/page.mdx deleted file mode 100644 index d7ffc70..0000000 --- a/sdk-reference/desktop-python-sdk/v1.0.2/sandbox/page.mdx +++ /dev/null @@ -1,228 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.0.3/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.0.3/sandbox/page.mdx deleted file mode 100644 index d7ffc70..0000000 --- a/sdk-reference/desktop-python-sdk/v1.0.3/sandbox/page.mdx +++ /dev/null @@ -1,228 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.1.1/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.1.1/sandbox/page.mdx deleted file mode 100644 index d7ffc70..0000000 --- a/sdk-reference/desktop-python-sdk/v1.1.1/sandbox/page.mdx +++ /dev/null @@ -1,228 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.2.0/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.2.0/sandbox/page.mdx deleted file mode 100644 index d7ffc70..0000000 --- a/sdk-reference/desktop-python-sdk/v1.2.0/sandbox/page.mdx +++ /dev/null @@ -1,228 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.3.0/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.3.0/sandbox/page.mdx deleted file mode 100644 index f3c2632..0000000 --- a/sdk-reference/desktop-python-sdk/v1.3.0/sandbox/page.mdx +++ /dev/null @@ -1,255 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str | list[str]) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### drag - -```python -def drag(fr: tuple[int, int], to: tuple[int, int]) -``` - -Drag the mouse from the given position to the given position. - -**Arguments**: - -- `from`: The starting position. -- `to`: The ending position. - - -### wait - -```python -def wait(ms: int) -``` - -Wait for the given amount of time. - -**Arguments**: - -- `ms`: The amount of time to wait in milliseconds. - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.4.0/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.4.0/sandbox/page.mdx deleted file mode 100644 index 89c24bc..0000000 --- a/sdk-reference/desktop-python-sdk/v1.4.0/sandbox/page.mdx +++ /dev/null @@ -1,273 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### mouse\_press - -```python -def mouse_press(button: Literal["left", "right", "middle"] = "left") -``` - -Press the mouse button. - - -### mouse\_release - -```python -def mouse_release(button: Literal["left", "right", "middle"] = "left") -``` - -Release the mouse button. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str | list[str]) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### drag - -```python -def drag(fr: tuple[int, int], to: tuple[int, int]) -``` - -Drag the mouse from the given position to the given position. - -**Arguments**: - -- `from`: The starting position. -- `to`: The ending position. - - -### wait - -```python -def wait(ms: int) -``` - -Wait for the given amount of time. - -**Arguments**: - -- `ms`: The amount of time to wait in milliseconds. - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.5.0/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.5.0/sandbox/page.mdx deleted file mode 100644 index 89c24bc..0000000 --- a/sdk-reference/desktop-python-sdk/v1.5.0/sandbox/page.mdx +++ /dev/null @@ -1,273 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### mouse\_press - -```python -def mouse_press(button: Literal["left", "right", "middle"] = "left") -``` - -Press the mouse button. - - -### mouse\_release - -```python -def mouse_release(button: Literal["left", "right", "middle"] = "left") -``` - -Release the mouse button. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str | list[str]) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### drag - -```python -def drag(fr: tuple[int, int], to: tuple[int, int]) -``` - -Drag the mouse from the given position to the given position. - -**Arguments**: - -- `from`: The starting position. -- `to`: The ending position. - - -### wait - -```python -def wait(ms: int) -``` - -Wait for the given amount of time. - -**Arguments**: - -- `ms`: The amount of time to wait in milliseconds. - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.5.1/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.5.1/sandbox/page.mdx deleted file mode 100644 index 89c24bc..0000000 --- a/sdk-reference/desktop-python-sdk/v1.5.1/sandbox/page.mdx +++ /dev/null @@ -1,273 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click() -``` - -Left click on the current mouse position. - - -### double\_click - -```python -def double_click() -``` - -Double left click on the current mouse position. - - -### right\_click - -```python -def right_click() -``` - -Right click on the current mouse position. - - -### middle\_click - -```python -def middle_click() -``` - -Middle click on the current mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### mouse\_press - -```python -def mouse_press(button: Literal["left", "right", "middle"] = "left") -``` - -Press the mouse button. - - -### mouse\_release - -```python -def mouse_release(button: Literal["left", "right", "middle"] = "left") -``` - -Release the mouse button. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str | list[str]) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### drag - -```python -def drag(fr: tuple[int, int], to: tuple[int, int]) -``` - -Drag the mouse from the given position to the given position. - -**Arguments**: - -- `from`: The starting position. -- `to`: The ending position. - - -### wait - -```python -def wait(ms: int) -``` - -Wait for the given amount of time. - -**Arguments**: - -- `ms`: The amount of time to wait in milliseconds. - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/sdk-reference/desktop-python-sdk/v1.5.2/sandbox/page.mdx b/sdk-reference/desktop-python-sdk/v1.5.2/sandbox/page.mdx deleted file mode 100644 index 88e0f0c..0000000 --- a/sdk-reference/desktop-python-sdk/v1.5.2/sandbox/page.mdx +++ /dev/null @@ -1,264 +0,0 @@ - - - - - -## Sandbox - -```python -class Sandbox(SandboxBase) -``` - - -### \_\_init\_\_ - -```python -def __init__(resolution: Optional[Tuple[int, int]] = None, - dpi: Optional[int] = None, - display: Optional[str] = None, - template: Optional[str] = None, - timeout: Optional[int] = None, - metadata: Optional[Dict[str, str]] = None, - envs: Optional[Dict[str, str]] = None, - api_key: Optional[str] = None, - domain: Optional[str] = None, - debug: Optional[bool] = None, - sandbox_id: Optional[str] = None, - request_timeout: Optional[float] = None) -``` - -Create a new desktop sandbox. - -By default, the sandbox is created from the `desktop` template. - -**Arguments**: - -- `resolution`: Startup the desktop with custom screen resolution. Defaults to (1024, 768) -- `dpi`: Startup the desktop with custom DPI. Defaults to 96 -- `display`: Startup the desktop with custom display. Defaults to ":0" -- `template`: Sandbox template name or ID -- `timeout`: Timeout for the sandbox in **seconds**, default to 300 seconds. Maximum time a sandbox can be kept alive is 24 hours (86_400 seconds) for Pro users and 1 hour (3_600 seconds) for Hobby users -- `metadata`: Custom metadata for the sandbox -- `envs`: Custom environment variables for the sandbox -- `api_key`: E2B API Key to use for authentication, defaults to `E2B_API_KEY` environment variable -- `domain`: E2B domain to use for authentication, defaults to `E2B_DOMAIN` environment variable -- `debug`: If True, the sandbox will be created in debug mode, defaults to `E2B_DEBUG` environment variable -- `sandbox_id`: Sandbox ID to connect to, defaults to `E2B_SANDBOX_ID` environment variable -- `request_timeout`: Timeout for the request in **seconds** - -**Returns**: - -sandbox instance for the new sandbox - - -### screenshot - -```python -@overload -def screenshot(format: Literal["stream"]) -> Iterator[bytes] -``` - -Take a screenshot and return it as a stream of bytes. - - -### screenshot - -```python -@overload -def screenshot(format: Literal["bytes"]) -> bytearray -``` - -Take a screenshot and return it as a bytearray. - - -### screenshot - -```python -def screenshot(format: Literal["bytes", "stream"] = "bytes") -``` - -Take a screenshot and return it in the specified format. - -**Arguments**: - -- `format`: The format of the screenshot. Can be 'bytes', 'blob', or 'stream'. - -**Returns**: - -The screenshot in the specified format. - - -### left\_click - -```python -def left_click(x: Optional[int] = None, y: Optional[int] = None) -``` - -Left click on the mouse position. - - -### double\_click - -```python -def double_click(x: Optional[int] = None, y: Optional[int] = None) -``` - -Double left click on the mouse position. - - -### middle\_click - -```python -def middle_click(x: Optional[int] = None, y: Optional[int] = None) -``` - -Middle click on the mouse position. - - -### scroll - -```python -def scroll(direction: Literal["up", "down"] = "down", amount: int = 1) -``` - -Scroll the mouse wheel by the given amount. - -**Arguments**: - -- `direction`: The direction to scroll. Can be "up" or "down". -- `amount`: The amount to scroll. - - -### move\_mouse - -```python -def move_mouse(x: int, y: int) -``` - -Move the mouse to the given coordinates. - -**Arguments**: - -- `x`: The x coordinate. -- `y`: The y coordinate. - - -### mouse\_press - -```python -def mouse_press(button: Literal["left", "right", "middle"] = "left") -``` - -Press the mouse button. - - -### mouse\_release - -```python -def mouse_release(button: Literal["left", "right", "middle"] = "left") -``` - -Release the mouse button. - - -### get\_cursor\_position - -```python -def get_cursor_position() -> tuple[int, int] -``` - -Get the current cursor position. - -**Raises**: - -- `RuntimeError`: If the cursor position cannot be determined - -**Returns**: - -A tuple with the x and y coordinates - - -### get\_screen\_size - -```python -def get_screen_size() -> tuple[int, int] -``` - -Get the current screen size. - -**Raises**: - -- `RuntimeError`: If the screen size cannot be determined - -**Returns**: - -A tuple with the width and height - - -### write - -```python -def write(text: str, *, chunk_size: int = 25, delay_in_ms: int = 75) -> None -``` - -Write the given text at the current cursor position. - -**Arguments**: - -- `text`: The text to write. -- `chunk_size`: The size of each chunk of text to write. -- `delay_in_ms`: The delay between each chunk of text. - - -### press - -```python -def press(key: str | list[str]) -``` - -Press a key. - -**Arguments**: - -- `key`: The key to press (e.g. "enter", "space", "backspace", etc.). - - -### drag - -```python -def drag(fr: tuple[int, int], to: tuple[int, int]) -``` - -Drag the mouse from the given position to the given position. - -**Arguments**: - -- `from`: The starting position. -- `to`: The ending position. - - -### wait - -```python -def wait(ms: int) -``` - -Wait for the given amount of time. - -**Arguments**: - -- `ms`: The amount of time to wait in milliseconds. - - -### open - -```python -def open(file_or_url: str) -``` - -Open a file or a URL in the default application. - -**Arguments**: - -- `file_or_url`: The file or URL to open. - diff --git a/template/.python-version b/template/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/template/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/template/45-allow-colord.pkla b/template/45-allow-colord.pkla deleted file mode 100644 index ca79d96..0000000 --- a/template/45-allow-colord.pkla +++ /dev/null @@ -1,6 +0,0 @@ -[Allow Colord all Users] -Identity=unix-user:* -Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile -ResultAny=no -ResultInactive=no -ResultActive=yes \ No newline at end of file diff --git a/template/README.md b/template/README.md new file mode 100644 index 0000000..d2db436 --- /dev/null +++ b/template/README.md @@ -0,0 +1,15 @@ +# E2B Desktop Template + +This is the template for the E2B Desktop Sandbox. + +## Building the template + +```bash +poetry run python build_dev.py +``` + +## Building the production image + +```bash +poetry run python build_prod.py +``` diff --git a/template/Xauthority b/template/Xauthority deleted file mode 100644 index e69de29..0000000 diff --git a/template/build_dev.py b/template/build_dev.py new file mode 100644 index 0000000..ed08c02 --- /dev/null +++ b/template/build_dev.py @@ -0,0 +1,13 @@ +from dotenv import load_dotenv +from e2b import Template, default_build_logger +from template import template_with_user_workdir + +load_dotenv() + +Template.build( + template=template_with_user_workdir, + alias="desktop-dev", + cpu_count=8, + memory_mb=8192, + on_build_logs=default_build_logger(), +) diff --git a/template/build_docker.py b/template/build_docker.py new file mode 100644 index 0000000..72a439b --- /dev/null +++ b/template/build_docker.py @@ -0,0 +1,5 @@ +from e2b import Template +from template import template + +# output the template to stdout to pipe into docker buildx +print(Template.to_dockerfile(template)) diff --git a/template/build_prod.py b/template/build_prod.py new file mode 100644 index 0000000..0652e64 --- /dev/null +++ b/template/build_prod.py @@ -0,0 +1,13 @@ +from dotenv import load_dotenv +from e2b import Template, default_build_logger +from template import template_with_user_workdir + +load_dotenv() + +Template.build( + template_with_user_workdir, + alias="desktop", + cpu_count=8, + memory_mb=8192, + on_build_logs=default_build_logger(), +) diff --git a/template/e2b.Dockerfile b/template/e2b.Dockerfile deleted file mode 100644 index b394c7f..0000000 --- a/template/e2b.Dockerfile +++ /dev/null @@ -1,126 +0,0 @@ -FROM ubuntu:22.04 - -ENV DEBIAN_FRONTEND=noninteractive -ENV DEBIAN_PRIORITY=high - -RUN yes | unminimize -RUN apt-get update && apt-get --reinstall install -y python3-jwt python3-oauthlib python3-lazr.restfulclient \ - python3-launchpadlib python3-apport xserver-xorg apport xorg - -RUN apt-get update && apt-get install -y \ - python3-xlib \ - x11-xserver-utils \ - xfce4 \ - xfce4-goodies \ - xvfb \ - xubuntu-icon-theme \ - scrot \ - python3-pip \ - python3-tk \ - python3-dev \ - x11-utils \ - gnumeric \ - python-is-python3 \ - build-essential \ - util-linux \ - locales \ - xauth \ - gnome-screenshot \ - xserver-xorg \ - ffmpeg \ - vim \ - xorg - -RUN pip3 install mux_python requests - -# Install vscode -RUN apt update -y \ - && apt install -y software-properties-common apt-transport-https wget \ - && wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add - \ - && add-apt-repository -y "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" \ - && apt update -y \ - && apt install -y code -# Create the vscode config directory -RUN mkdir -p /home/user/.config/Code/User -# Set up the vscode autosave delay for 200ms -# Remove the "trust directory popup" prompt for vscode -RUN echo "{\"files.autoSave\": \"afterDelay\", \"files.autoSaveDelay\": 200, \"security.allowHttp\": true, \"security.workspace.trust.startupPrompt\": \"never\", \"security.workspace.trust.enabled\": false, \"security.workspace.trust.banner\": \"never\", \"security.workspace.trust.emptyWindow\": false}" > /home/user/.config/Code/User/settings.json - -ENV PIP_DEFAULT_TIMEOUT=100 \ - PIP_DISABLE_PIP_VERSION_CHECK=1 \ - PIP_NO_CACHE_DIR=1 \ - DEBIAN_FRONTEND=noninteractive - -COPY ./requirements.txt requirements.txt -RUN pip3 install --no-cache-dir -r requirements.txt - -COPY ./45-allow-colord.pkla /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla - -COPY ./Xauthority /home/user/.Xauthority - -RUN apt-get update && \ - apt-get -y upgrade && \ - apt-get -y install \ - build-essential \ - # UI Requirements - xvfb \ - xterm \ - xdotool \ - scrot \ - imagemagick \ - sudo \ - mutter \ - x11vnc \ - # Python/pyenv reqs - build-essential \ - libssl-dev \ - zlib1g-dev \ - libbz2-dev \ - libreadline-dev \ - libsqlite3-dev \ - curl \ - git \ - libncursesw5-dev \ - xz-utils \ - tk-dev \ - libxml2-dev \ - libxmlsec1-dev \ - libffi-dev \ - liblzma-dev \ - # Network tools - net-tools \ - netcat \ - # PPA req - software-properties-common && \ - # Userland apps - sudo add-apt-repository ppa:mozillateam/ppa && \ - sudo apt-get install -y --no-install-recommends \ - libreoffice \ - firefox-esr \ - x11-apps \ - xpdf \ - gedit \ - xpaint \ - tint2 \ - galculator \ - pcmanfm \ - unzip && \ - apt-get clean - -# Select the default terminal to xfce4-terminal.wrapper -RUN sudo ln -sf /usr/bin/xfce4-terminal.wrapper /etc/alternatives/x-terminal-emulator - -# Install numpy which is used by websockify: https://github.com/novnc/websockify/issues/337 -RUN pip install numpy - -# Install noVNC and websockify -# -# Invalidate cache so we always pull the latest noVNC and websockify -# otherwise, Docker might not execute the `RUN` command if it's cached from the previous build -ARG CACHEBUST=1 -RUN git clone --branch e2b-desktop https://github.com/e2b-dev/noVNC.git /opt/noVNC && \ - git clone --branch v0.12.0 https://github.com/novnc/websockify /opt/noVNC/utils/websockify && \ - ln -s /opt/noVNC/vnc.html /opt/noVNC/index.html - -# Copy E2B desktop wallpaper -COPY ./wallpaper.png /usr/share/backgrounds/xfce/wallpaper.png \ No newline at end of file diff --git a/template/e2b.toml b/template/e2b.toml deleted file mode 100644 index b002ac4..0000000 --- a/template/e2b.toml +++ /dev/null @@ -1,18 +0,0 @@ -# This is a config for E2B sandbox template. -# You can use template ID (k0wmnzir0zuzye6dndlw) or template name (desktop) to create a sandbox: - -# Python SDK -# from e2b import Sandbox, AsyncSandbox -# sandbox = Sandbox("desktop") # Sync sandbox -# sandbox = await AsyncSandbox.create("desktop") # Async sandbox - -# JS SDK -# import { Sandbox } from 'e2b' -# const sandbox = await Sandbox.create('desktop') - -team_id = "460355b3-4f64-48f9-9a16-4442817f79f5" -memory_mb = 8_192 -cpu_count = 8 -dockerfile = "e2b.Dockerfile" -template_name = "desktop" -template_id = "k0wmnzir0zuzye6dndlw" diff --git a/template/files/firefox-autoconfig.js b/template/files/firefox-autoconfig.js new file mode 100644 index 0000000..7c6fba9 --- /dev/null +++ b/template/files/firefox-autoconfig.js @@ -0,0 +1,2 @@ +pref("general.config.filename", "firefox.cfg"); +pref("general.config.obscure_value", 0); diff --git a/template/files/firefox-policies.json b/template/files/firefox-policies.json new file mode 100644 index 0000000..4ef094b --- /dev/null +++ b/template/files/firefox-policies.json @@ -0,0 +1,7 @@ +{ + "policies": { + "DisableFirstRunPage": true, + "OverrideFirstRunPage": "", + "OverridePostUpdatePage": "" + } +} \ No newline at end of file diff --git a/template/files/firefox.cfg b/template/files/firefox.cfg new file mode 100644 index 0000000..4a0eb50 --- /dev/null +++ b/template/files/firefox.cfg @@ -0,0 +1,34 @@ +// Disable first-run and onboarding +pref("browser.startup.homepage_override.mstone", "ignore"); +pref("browser.startup.homepage_override.buildID", ""); +pref("browser.aboutwelcome.enabled", false); +pref("browser.messaging-system.whatsNewPanel.enabled", false); + +// Disable Firefox studies and telemetry +pref("app.shield.optoutstudies.enabled", false); +pref("app.normandy.enabled", false); +pref("app.normandy.api_url", ""); +pref("toolkit.telemetry.enabled", false); +pref("toolkit.telemetry.unified", false); +pref("toolkit.telemetry.archive.enabled", false); +pref("datareporting.healthreport.uploadEnabled", false); +pref("datareporting.policy.dataSubmissionEnabled", false); + +// Disable sponsored suggestions in address bar (Firefox Suggest) +pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); +pref("browser.urlbar.suggest.quicksuggest.sponsored", false); +pref("browser.urlbar.quicksuggest.enabled", false); + +// Disable Pocket and all new tab sponsored stuff +pref("extensions.pocket.enabled", false); +pref("browser.newtabpage.activity-stream.feeds.section.topstories", false); +pref("browser.newtabpage.activity-stream.feeds.snippets", false); +pref("browser.newtabpage.activity-stream.showSponsored", false); +pref("browser.newtabpage.activity-stream.showSponsoredTopSites", false); + +// Disable extension recommendations +pref("extensions.htmlaboutaddons.recommendations.enabled", false); +pref("browser.discovery.enabled", false); + +// Disable automatic updates +pref("app.update.auto", false); diff --git a/template/files/google-chrome.desktop b/template/files/google-chrome.desktop new file mode 100644 index 0000000..d38c71d --- /dev/null +++ b/template/files/google-chrome.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Version=1.0 +Name=Google Chrome +Exec=/usr/bin/google-chrome-stable --no-first-run --no-default-browser-check --password-store=basic +Terminal=false +Icon=google-chrome +Type=Application +Categories=Network;WebBrowser; +MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https; +StartupWMClass=Google-chrome \ No newline at end of file diff --git a/template/files/screensaver.desktop b/template/files/screensaver.desktop new file mode 100644 index 0000000..d5bebfe --- /dev/null +++ b/template/files/screensaver.desktop @@ -0,0 +1,7 @@ +[Desktop Entry] +Type=Application +Name=Disable Screen Blanking +Exec=sh -c "sleep 2; xset s off; xset s noblank; xset -dpms" +Hidden=false +NoDisplay=true +X-GNOME-Autostart-enabled=true diff --git a/template/files/settings.json b/template/files/settings.json new file mode 100644 index 0000000..4473fa2 --- /dev/null +++ b/template/files/settings.json @@ -0,0 +1,9 @@ +{ + "files.autoSave": "afterDelay", + "files.autoSaveDelay": 200, + "security.allowHttp": true, + "security.workspace.trust.startupPrompt": "never", + "security.workspace.trust.enabled": false, + "security.workspace.trust.banner": "never", + "security.workspace.trust.emptyWindow": false +} diff --git a/template/wallpaper.png b/template/files/wallpaper.png similarity index 100% rename from template/wallpaper.png rename to template/files/wallpaper.png diff --git a/template/files/xfce4-desktop.xml b/template/files/xfce4-desktop.xml new file mode 100644 index 0000000..ddc5593 --- /dev/null +++ b/template/files/xfce4-desktop.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/template/poetry.lock b/template/poetry.lock new file mode 100644 index 0000000..b2835ad --- /dev/null +++ b/template/poetry.lock @@ -0,0 +1,417 @@ +# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.11.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc"}, + {file = "anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.31.0)"] + +[[package]] +name = "attrs" +version = "25.4.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, +] + +[[package]] +name = "bracex" +version = "2.6" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "bracex-2.6-py3-none-any.whl", hash = "sha256:0b0049264e7340b3ec782b5cb99beb325f36c3782a32e36e876452fd49a09952"}, + {file = "bracex-2.6.tar.gz", hash = "sha256:98f1347cd77e22ee8d967a30ad4e310b233f7754dbf31ff3fceb76145ba47dc7"}, +] + +[[package]] +name = "certifi" +version = "2025.10.5" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de"}, + {file = "certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43"}, +] + +[[package]] +name = "dockerfile-parse" +version = "2.0.1" +description = "Python library for Dockerfile manipulation" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "dockerfile-parse-2.0.1.tar.gz", hash = "sha256:3184ccdc513221983e503ac00e1aa504a2aa8f84e5de673c46b0b6eee99ec7bc"}, + {file = "dockerfile_parse-2.0.1-py2.py3-none-any.whl", hash = "sha256:bdffd126d2eb26acf1066acb54cb2e336682e1d72b974a40894fac76a4df17f6"}, +] + +[[package]] +name = "dotenv" +version = "0.9.9" +description = "Deprecated package" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "dotenv-0.9.9-py2.py3-none-any.whl", hash = "sha256:29cf74a087b31dafdb5a446b6d7e11cbce8ed2741540e2339c69fbef92c94ce9"}, +] + +[package.dependencies] +python-dotenv = "*" + +[[package]] +name = "e2b" +version = "2.16.0" +description = "E2B SDK that give agents cloud environments" +optional = false +python-versions = "<4.0,>=3.10" +groups = ["main"] +files = [ + {file = "e2b-2.16.0-py3-none-any.whl", hash = "sha256:e2bb38fce01e1fe076818aa731b45208f2eef4b843d90b61c48cb23985a7ef52"}, + {file = "e2b-2.16.0.tar.gz", hash = "sha256:e661fbd5524bf4435730eca081de7b74861f30366731a027c1c8503316e8890c"}, +] + +[package.dependencies] +attrs = ">=23.2.0" +dockerfile-parse = ">=2.0.1,<3.0.0" +httpcore = ">=1.0.5,<2.0.0" +httpx = ">=0.27.0,<1.0.0" +packaging = ">=24.1" +protobuf = ">=4.21.0" +python-dateutil = ">=2.8.2" +rich = ">=14.0.0" +typing-extensions = ">=4.1.0" +wcmatch = ">=10.1,<11.0" + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version == \"3.10\"" +files = [ + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, + {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.16" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<1.0)"] + +[[package]] +name = "httpx" +version = "0.28.1" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" + +[package.extras] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "idna" +version = "3.11" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "markdown-it-py" +version = "4.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147"}, + {file = "markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "markdown-it-pyrs", "mistletoe (>=1.0,<2.0)", "mistune (>=3.0,<4.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins (>=0.5.0)"] +profiling = ["gprof2dot"] +rtd = ["ipykernel", "jupyter_sphinx", "mdit-py-plugins (>=0.5.0)", "myst-parser", "pyyaml", "sphinx", "sphinx-book-theme (>=1.0,<2.0)", "sphinx-copybutton", "sphinx-design"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions", "requests"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "packaging" +version = "25.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, +] + +[[package]] +name = "protobuf" +version = "6.33.5" +description = "" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b"}, + {file = "protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c"}, + {file = "protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd"}, + {file = "protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0"}, + {file = "protobuf-6.33.5-cp39-cp39-win32.whl", hash = "sha256:a3157e62729aafb8df6da2c03aa5c0937c7266c626ce11a278b6eb7963c4e37c"}, + {file = "protobuf-6.33.5-cp39-cp39-win_amd64.whl", hash = "sha256:8f04fa32763dcdb4973d537d6b54e615cc61108c7cb38fe59310c3192d29510a"}, + {file = "protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02"}, + {file = "protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c"}, +] + +[[package]] +name = "pygments" +version = "2.19.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, + {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.2.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61"}, + {file = "python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "rich" +version = "14.2.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd"}, + {file = "rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "ruff" +version = "0.15.6" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +groups = ["dev"] +files = [ + {file = "ruff-0.15.6-py3-none-linux_armv6l.whl", hash = "sha256:7c98c3b16407b2cf3d0f2b80c80187384bc92c6774d85fefa913ecd941256fff"}, + {file = "ruff-0.15.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ee7dcfaad8b282a284df4aa6ddc2741b3f4a18b0555d626805555a820ea181c3"}, + {file = "ruff-0.15.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3bd9967851a25f038fc8b9ae88a7fbd1b609f30349231dffaa37b6804923c4bb"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13f4594b04e42cd24a41da653886b04d2ff87adbf57497ed4f728b0e8a4866f8"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e2ed8aea2f3fe57886d3f00ea5b8aae5bf68d5e195f487f037a955ff9fbaac9e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70789d3e7830b848b548aae96766431c0dc01a6c78c13381f423bf7076c66d15"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:542aaf1de3154cea088ced5a819ce872611256ffe2498e750bbae5247a8114e9"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c22e6f02c16cfac3888aa636e9eba857254d15bbacc9906c9689fdecb1953ab"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98893c4c0aadc8e448cfa315bd0cc343a5323d740fe5f28ef8a3f9e21b381f7e"}, + {file = "ruff-0.15.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:70d263770d234912374493e8cc1e7385c5d49376e41dfa51c5c3453169dc581c"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:55a1ad63c5a6e54b1f21b7514dfadc0c7fb40093fa22e95143cf3f64ebdcd512"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8dc473ba093c5ec238bb1e7429ee676dca24643c471e11fbaa8a857925b061c0"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:85b042377c2a5561131767974617006f99f7e13c63c111b998f29fc1e58a4cfb"}, + {file = "ruff-0.15.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cef49e30bc5a86a6a92098a7fbf6e467a234d90b63305d6f3ec01225a9d092e0"}, + {file = "ruff-0.15.6-py3-none-win32.whl", hash = "sha256:bbf67d39832404812a2d23020dda68fee7f18ce15654e96fb1d3ad21a5fe436c"}, + {file = "ruff-0.15.6-py3-none-win_amd64.whl", hash = "sha256:aee25bc84c2f1007ecb5037dff75cef00414fdf17c23f07dc13e577883dca406"}, + {file = "ruff-0.15.6-py3-none-win_arm64.whl", hash = "sha256:c34de3dd0b0ba203be50ae70f5910b17188556630e2178fd7d79fc030eb0d837"}, + {file = "ruff-0.15.6.tar.gz", hash = "sha256:8394c7bb153a4e3811a4ecdacd4a8e6a4fa8097028119160dffecdcdf9b56ae4"}, +] + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, +] + +[[package]] +name = "wcmatch" +version = "10.1" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "wcmatch-10.1-py3-none-any.whl", hash = "sha256:5848ace7dbb0476e5e55ab63c6bbd529745089343427caa5537f230cc01beb8a"}, + {file = "wcmatch-10.1.tar.gz", hash = "sha256:f11f94208c8c8484a16f4f48638a85d771d9513f4ab3f37595978801cb9465af"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + +[metadata] +lock-version = "2.1" +python-versions = "^3.10" +content-hash = "e79ec69699b841d2635a43a1ffb8e38a75678fe5dda71c7bab81fa8bdeebd054" diff --git a/template/pyproject.toml b/template/pyproject.toml new file mode 100644 index 0000000..dc8e8e8 --- /dev/null +++ b/template/pyproject.toml @@ -0,0 +1,16 @@ +[project] +name = "e2b_desktop" +version = "0.1.0" +description = "E2B Desktop Template" +readme = "README.md" + +[tool.poetry] +package-mode = false + +[tool.poetry.dependencies] +python = "^3.10" +e2b = "^2.3.5" + +[tool.poetry.group.dev.dependencies] +dotenv = "^0.9.9" +ruff = "^0.15.0" diff --git a/template/requirements.txt b/template/requirements.txt deleted file mode 100644 index ff7bfa7..0000000 --- a/template/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -pyvirtualdisplay -pyscreenshot -pyautogui -pillow -EasyProcess -python-xlib -opencv-python -keyboard diff --git a/template/template.py b/template/template.py new file mode 100644 index 0000000..4199965 --- /dev/null +++ b/template/template.py @@ -0,0 +1,127 @@ +from e2b import CopyItem, Template + +template = ( + Template(file_context_path="files") + .from_image("ubuntu:22.04") + .set_user("root") + .set_workdir("/") + .set_envs( + { + # Avoid system prompts + "DEBIAN_FRONTEND": "noninteractive", + "DEBIAN_PRIORITY": "high", + # Pip settings + "PIP_DEFAULT_TIMEOUT": "100", + "PIP_DISABLE_PIP_VERSION_CHECK": "1", + "PIP_NO_CACHE_DIR": "1", + } + ) + # Initial system setup and packages + .run_cmd("yes | unminimize") + .apt_install( + [ + "xserver-xorg", + "x11-xserver-utils", + "xvfb", + "x11-utils", + "xauth", + "xfce4", + "xfce4-goodies", + "util-linux", + "sudo", + "curl", + "git", + "wget", + "python3-pip", + "xdotool", + "scrot", + "ffmpeg", + "x11vnc", + "net-tools", + "netcat", + "x11-apps", + "libreoffice", + "xpdf", + "gedit", + "xpaint", + "tint2", + "galculator", + "pcmanfm", + "software-properties-common", + "apt-transport-https", + "libgtk-3-bin", + ] + ) + .pip_install("numpy") + # Setup NoVNC and websockify + .git_clone( + "https://github.com/e2b-dev/noVNC.git", "/opt/noVNC", branch="e2b-desktop" + ) + .make_symlink("/opt/noVNC/vnc.html", "/opt/noVNC/index.html") + .git_clone( + "https://github.com/novnc/websockify.git", + "/opt/noVNC/utils/websockify", + branch="v0.12.0", + ) + # Install browsers and set up repositories + .run_cmd( + [ + "add-apt-repository ppa:mozillateam/ppa", + "wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -", + 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list', + "wget -qO- https://packages.microsoft.com/keys/microsoft.asc | apt-key add -", + 'add-apt-repository -y "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"', + "apt-get update", + ], + ) + # Install browsers and VS Code + .apt_install(["firefox-esr", "google-chrome-stable", "code"]) + # Configure system settings + .make_symlink( + "/usr/bin/xfce4-terminal.wrapper", + "/etc/alternatives/x-terminal-emulator", + force=True, + ) + .run_cmd("update-alternatives --set x-www-browser /usr/bin/firefox-esr") + .make_dir("/home/user/.config/Code/User") + .make_dir("/home/user/.config/xfce4/xfconf/xfce-perchannel-xml/") + .make_dir("/home/user/.config/autostart") + .run_cmd("update-desktop-database /usr/share/applications/") + # Copy all configuration files + .copy_items( + [ + CopyItem( + src="google-chrome.desktop", + dest="/usr/share/applications/google-chrome.desktop", + ), + CopyItem( + src="settings.json", + dest="/home/user/.config/Code/User/settings.json", + ), + CopyItem( + src="wallpaper.png", + dest="/usr/share/backgrounds/xfce/wallpaper.png", + ), + CopyItem( + src="xfce4-desktop.xml", + dest="/home/user/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-desktop.xml", + ), + CopyItem( + src="screensaver.desktop", + dest="/home/user/.config/autostart/screensaver.desktop", + ), + CopyItem( + src="firefox-policies.json", + dest="/usr/lib/firefox-esr/distribution/policies.json", + ), + CopyItem( + src="firefox-autoconfig.js", + dest="/usr/lib/firefox-esr/defaults/pref/autoconfig.js", + ), + CopyItem(src="firefox.cfg", dest="/usr/lib/firefox-esr/firefox.cfg"), + ] + ) +) + +# Template with user and workdir set +template_with_user_workdir = template.set_user("user").set_workdir("/home/user")