diff --git a/.cursor/commands/opencontext-context.md b/.cursor/commands/opencontext-context.md deleted file mode 100644 index f6f3f8b..0000000 --- a/.cursor/commands/opencontext-context.md +++ /dev/null @@ -1,19 +0,0 @@ ---- Cursor Command: opencontext-context.md --- ---- -title: /opencontext-context -description: Load relevant OpenContext docs for the current task (safe, no index build) ---- - -Goal: Load enough context from OpenContext so you can proceed confidently. -Safety: Do NOT trigger index builds by default (no `oc index build`). Prefer manifest + direct reads. - -1. If the target space/folder is unclear, run `oc folder ls --all` and ask the user to choose a folder (no guessing when ambiguous). -2. Run `oc context manifest --limit 10` (or `oc context manifest . --limit 10` for broad context). -3. Load 3–10 relevant files by `abs_path` and extract: - - Key constraints, decisions, and current state - - Open questions / risks -4. Cite sources: - - Prefer stable links `oc://doc/` when available in the manifest output. - - Use `abs_path` + `range` only for line-level evidence. -5. Summarize the loaded context and proceed with the user’s task. ---- End Command --- diff --git a/.cursor/commands/opencontext-create.md b/.cursor/commands/opencontext-create.md deleted file mode 100644 index 58e89df..0000000 --- a/.cursor/commands/opencontext-create.md +++ /dev/null @@ -1,25 +0,0 @@ ---- Cursor Command: opencontext-create.md --- ---- -title: /opencontext-create -description: Create a new idea or problem statement inside OpenContext ---- - -0. **Blocking requirement**: Do NOT answer the user’s broader question until the document has been created and minimally populated. -1. Infer the target space from recent context; if unclear, ask the user to specify the space (no default). -2. Derive a concise idea title & summary from the current conversation, then generate a slug (kebab-case; fallback to `idea-`). Only ask the user if information is insufficient. -3. Determine the target folder path under OpenContext (do NOT assume fixed subfolders like `ideas/`): - - If the user gave a target folder, use it. - - Otherwise, infer a sensible default and confirm with the user (or ask the user to choose). - - If you are unsure what folders exist, run `oc folder ls --all` and pick/ask accordingly. -4. Ensure the target folder exists by running `oc folder create -d ""` (safe to rerun). -5. **[CRITICAL - DO NOT SKIP]** You MUST run: `oc doc create .md -d ""` to create the document. - - This command registers the document in the OpenContext database. - - DO NOT directly create the file with Write tool - you MUST use `oc doc create` first. - - The command will output the file path after successful creation. -6. After `oc doc create` succeeds, set `CONTEXTS_ROOT=${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}` and edit `${CONTEXTS_ROOT}/<folder_path>/<slug>.md` directly - do not mirror it inside the project repo. -7. Populate that file with: - - Title / problem statement - - Initial description/background - - “Related Requests” list (can be empty placeholders) -8. Return the document path and immediately keep organizing content (no follow-up questions unless critical info is missing). ---- End Command --- diff --git a/.cursor/commands/opencontext-help.md b/.cursor/commands/opencontext-help.md deleted file mode 100644 index 0890863..0000000 --- a/.cursor/commands/opencontext-help.md +++ /dev/null @@ -1,16 +0,0 @@ ---- Cursor Command: opencontext-help.md --- ---- -title: /opencontext-help -description: Start here — choose the right OpenContext command (beginner-friendly) ---- - -You are assisting a user who may be new to OpenContext. Your goal is to route them to the right workflow and execute it. - -1. Ask the user which of these they want (pick one): - - A) "I want to find what I've written before" → use **/opencontext-search** - - B) "I want to load background/context for the current task" → use **/opencontext-context** - - C) "I want to create a new doc/idea" → use **/opencontext-create** - - D) "I want to save/update a doc with what we just learned" → use **/opencontext-iterate** -2. If they are unsure, default to **/opencontext-context**. -3. Then run the chosen command and continue the task. ---- End Command --- diff --git a/.cursor/commands/opencontext-iterate.md b/.cursor/commands/opencontext-iterate.md deleted file mode 100644 index 860074f..0000000 --- a/.cursor/commands/opencontext-iterate.md +++ /dev/null @@ -1,16 +0,0 @@ ---- Cursor Command: opencontext-iterate.md --- ---- -title: /opencontext-iterate -description: Enrich an existing idea with additional context from OpenContext ---- - -1. Identify the target idea document from the current discussion (ask only if ambiguous). Set `CONTEXTS_ROOT=${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}` and load `${CONTEXTS_ROOT}/<target_doc>` to understand existing sections (never duplicate it under the project repo). -2. Derive the owning space from the doc path (e.g., `<space>/.../foo.md` → space `<space>`). If the space is unclear, run `oc folder ls --all`. Then run `oc context manifest <space> --limit 10` (or `oc context manifest . --limit 10`) and load each `abs_path` for inspiration. -3. Update the Markdown directly in the global file: - - Ensure a `## Iteration Log` section exists (create if missing). - - Append a new entry timestamped with local date/time in readable format (e.g., `2025-12-11 17:00` or `Dec 11, 2025 5:00 PM`) that summarizes insights, cites referenced docs, and lists next steps/risks. - - **Citation rule (DO NOT SKIP)**: when citing any OpenContext doc in `Iteration Log`, you MUST use the stable link format `oc://doc/<stable_id>` as the primary reference (example: `[label](oc://doc/<stable_id>)`). Only add `abs_path` and/or `range` when you specifically need auditability or line-level evidence. Do NOT cite using only file paths if `stable_id` is available in the manifest output. - - Refresh any other impacted sections (Overview, Requirements, Implementation notes, etc.). -4. Save the updated document and call `oc doc set-desc <target_doc> "<latest summary>"` so the manifest reflects the newest iteration. -5. Report the updated doc path plus which references were used. ---- End Command --- diff --git a/.cursor/commands/opencontext-search.md b/.cursor/commands/opencontext-search.md deleted file mode 100644 index 163fdbf..0000000 --- a/.cursor/commands/opencontext-search.md +++ /dev/null @@ -1,18 +0,0 @@ ---- Cursor Command: opencontext-search.md --- ---- -title: /opencontext-search -description: Search OpenContext to find the right docs (safe, no index build by default) ---- - -Goal: Help the user find relevant existing docs quickly. -Safety: Do NOT trigger index builds by default (cost may be unpredictable). - -1. Ask the user for a short query (or infer one from the conversation). -2. Try search in read-only mode: - - Run: `oc search "<query>" --format json --limit 10` - - If it succeeds, use results to pick candidate docs and then use **/opencontext-context** (manifest + reads) to load and cite them. -3. If search fails due to missing index: - - Fall back to `oc context manifest <folder> --limit 20` and use doc `description` + filename triage. - - Optionally suggest a controlled index build, but do NOT run it unless the user explicitly approves. -4. Cite sources using stable links `oc://doc/<stable_id>` when available. ---- End Command --- diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..e432950 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,27 @@ +changelog: + template: | + ## Downloads + - **macOS**: Download `.dmg` and double-click to install. + - **Windows**: Download `.msi` or `.exe`. + + ## 更新日志 + $CHANGES + + ## Contributors + $CONTRIBUTORS + categories: + - title: Features + labels: + - feature + - enhancement + - title: Bug Fixes + labels: + - bug + - fix + - title: Documentation + labels: + - docs + - documentation + - title: Other Changes + labels: + - "*" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b41e510..53e0317 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,10 @@ jobs: cd crates/opencontext-node npm ci npm run build:debug - + + - name: Use local native build for tests + run: npm uninstall @aicontextlab/core-native + - name: Run JS tests run: npm test diff --git a/.github/workflows/cli-smoke.yml b/.github/workflows/cli-smoke.yml new file mode 100644 index 0000000..c5aba19 --- /dev/null +++ b/.github/workflows/cli-smoke.yml @@ -0,0 +1,28 @@ +name: CLI smoke test (no publish) + +on: + workflow_dispatch: + +jobs: + linux-cli-smoke: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "22" + + - name: Install dependencies + run: npm install + + - name: Install CLI from repo (no publish) + run: npm install -g . + + - name: CLI help + run: oc --help + + - name: CLI init (expected to pass; if it fails, we capture logs) + run: oc init diff --git a/.github/workflows/desktop-build.yml b/.github/workflows/desktop-build.yml index 99e68ed..f5aa177 100644 --- a/.github/workflows/desktop-build.yml +++ b/.github/workflows/desktop-build.yml @@ -37,21 +37,29 @@ jobs: echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Version: $VERSION" + - name: Ensure tag exists (workflow_dispatch) + if: github.event_name == 'workflow_dispatch' && !startsWith(github.ref, 'refs/tags/desktop-v') + run: | + if [ "${{ steps.get_version.outputs.version }}" = "0.0.0-dev" ]; then + echo "Missing version for workflow_dispatch. Provide an input version." >&2 + exit 1 + fi + TAG="desktop-v${{ steps.get_version.outputs.version }}" + git fetch --tags + if git rev-parse "$TAG" >/dev/null 2>&1; then + echo "Tag $TAG already exists." + exit 0 + fi + git tag "$TAG" + git push origin "$TAG" + - name: Create Release id: create_release uses: softprops/action-gh-release@v1 with: tag_name: desktop-v${{ steps.get_version.outputs.version }} name: OpenContext Desktop v${{ steps.get_version.outputs.version }} - body: | - ## OpenContext Desktop v${{ steps.get_version.outputs.version }} - - ### 下载 - - **macOS**: 下载 `.dmg` 文件,双击安装 - - **Windows**: 下载 `.msi` 或 `.exe` 文件安装 - - ### 更新日志 - 请查看 [CHANGELOG](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) + generate_release_notes: true draft: true prerelease: false @@ -67,6 +75,9 @@ jobs: - platform: windows-latest target: x86_64-pc-windows-msvc artifact_name: windows + - platform: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + artifact_name: linux runs-on: ${{ matrix.platform }} @@ -97,8 +108,49 @@ jobs: if: matrix.platform == 'windows-latest' run: choco install protoc -y + - name: Install Linux dependencies + if: matrix.platform == 'ubuntu-22.04' + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf \ + protobuf-compiler + - name: Install npm dependencies - run: npm ci + run: npm ci --include=optional + + - name: Import Apple signing certificate + if: matrix.platform == 'macos-latest' + env: + APPLE_CERTIFICATE_P12: ${{ secrets.APPLE_CERTIFICATE_P12 }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + run: | + CERT_PATH="$RUNNER_TEMP/apple_cert.p12" + KEYCHAIN_PATH="$RUNNER_TEMP/app-signing.keychain-db" + echo "$APPLE_CERTIFICATE_P12" | base64 -D > "$CERT_PATH" + security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH" + security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security import "$CERT_PATH" -P "$APPLE_CERTIFICATE_PASSWORD" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" + security set-key-partition-list -S apple-tool:,apple: -s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" + security list-keychains -d user -s "$KEYCHAIN_PATH" + echo "KEYCHAIN_PATH=$KEYCHAIN_PATH" >> $GITHUB_ENV + + - name: Resolve signing identity + if: matrix.platform == 'macos-latest' + run: | + SIGNING_IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" | awk -F\" '/Developer ID Application/ {print $2; exit}') + if [ -z "$SIGNING_IDENTITY" ]; then + echo "No Developer ID Application identity found in keychain." >&2 + security find-identity -v -p codesigning "$KEYCHAIN_PATH" || true + exit 1 + fi + echo "APPLE_SIGNING_IDENTITY=$SIGNING_IDENTITY" >> $GITHUB_ENV - name: Update version in tauri.conf.json run: | @@ -111,17 +163,69 @@ jobs: - name: Build Tauri app (macOS) if: matrix.platform == 'macos-latest' + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_SIGNING_IDENTITY: ${{ env.APPLE_SIGNING_IDENTITY }} run: npm run tauri build -- --target universal-apple-darwin + - name: Notarize and staple DMG (macOS) + if: matrix.platform == 'macos-latest' + env: + APPLE_ID: ${{ secrets.APPLE_ID }} + APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + run: | + DMG_PATH=$(ls src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg | head -n 1) + if [ -z "$DMG_PATH" ]; then + echo "No DMG found to notarize." >&2 + exit 1 + fi + xcrun notarytool submit "$DMG_PATH" --apple-id "$APPLE_ID" --password "$APPLE_PASSWORD" --team-id "$APPLE_TEAM_ID" --wait + xcrun stapler staple "$DMG_PATH" + + - name: Verify notarized DMG (macOS) + if: matrix.platform == 'macos-latest' + run: | + DMG_PATH=$(ls src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg | head -n 1) + if [ -z "$DMG_PATH" ]; then + echo "No DMG found to verify." >&2 + exit 1 + fi + xcrun stapler validate "$DMG_PATH" + MOUNT_DIR=$(mktemp -d) + cleanup() { + if mount | grep -q "$MOUNT_DIR"; then + hdiutil detach "$MOUNT_DIR" -quiet || true + fi + rm -rf "$MOUNT_DIR" + } + trap cleanup EXIT + hdiutil attach "$DMG_PATH" -nobrowse -quiet -mountpoint "$MOUNT_DIR" + APP_PATH=$(find "$MOUNT_DIR" -maxdepth 1 -type d -name "*.app" | head -n 1) + if [ -z "$APP_PATH" ]; then + echo "No .app found inside DMG." >&2 + exit 1 + fi + spctl -a -vv --type execute "$APP_PATH" + - name: Build Tauri app (Windows) if: matrix.platform == 'windows-latest' run: npm run tauri build + - name: Build Tauri app (Linux) + if: matrix.platform == 'ubuntu-22.04' + run: npm run tauri build -- --bundles appimage + - name: Upload to Release (macOS) if: matrix.platform == 'macos-latest' uses: softprops/action-gh-release@v1 with: tag_name: desktop-v${{ needs.create-release.outputs.version }} + name: OpenContext Desktop v${{ needs.create-release.outputs.version }} + generate_release_notes: true + draft: true files: | src-tauri/target/universal-apple-darwin/release/bundle/dmg/*.dmg @@ -130,10 +234,22 @@ jobs: uses: softprops/action-gh-release@v1 with: tag_name: desktop-v${{ needs.create-release.outputs.version }} + name: OpenContext Desktop v${{ needs.create-release.outputs.version }} + generate_release_notes: true + draft: true files: | src-tauri/target/release/bundle/msi/*.msi src-tauri/target/release/bundle/nsis/*.exe + - name: Upload to Release (Linux) + if: matrix.platform == 'ubuntu-22.04' + uses: softprops/action-gh-release@v1 + with: + tag_name: desktop-v${{ needs.create-release.outputs.version }} + draft: true + files: | + src-tauri/target/release/bundle/appimage/*.AppImage + publish-release: needs: [create-release, build] runs-on: ubuntu-latest @@ -142,4 +258,6 @@ jobs: uses: softprops/action-gh-release@v1 with: tag_name: desktop-v${{ needs.create-release.outputs.version }} + name: OpenContext Desktop v${{ needs.create-release.outputs.version }} + generate_release_notes: true draft: false diff --git a/.github/workflows/native-build.yml b/.github/workflows/native-build.yml index 79e0d7d..46bab00 100644 --- a/.github/workflows/native-build.yml +++ b/.github/workflows/native-build.yml @@ -84,6 +84,11 @@ jobs: target: x86_64-pc-windows-msvc build: npm run build -- --target x86_64-pc-windows-msvc + # Linux + - host: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + build: npm run build -- --target x86_64-unknown-linux-gnu + steps: - uses: actions/checkout@v4 @@ -114,7 +119,12 @@ jobs: if: runner.os == 'Windows' run: choco install protoc -y working-directory: . - + + - name: Install Protobuf (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y protobuf-compiler + working-directory: . + - name: Install dependencies run: npm ci --omit=optional @@ -194,7 +204,8 @@ jobs: const targets = [ { rust: 'x86_64-apple-darwin', npm: 'darwin-x64', os: 'darwin', cpu: 'x64' }, { rust: 'aarch64-apple-darwin', npm: 'darwin-arm64', os: 'darwin', cpu: 'arm64' }, - { rust: 'x86_64-pc-windows-msvc', npm: 'win32-x64-msvc', os: 'win32', cpu: 'x64' } + { rust: 'x86_64-pc-windows-msvc', npm: 'win32-x64-msvc', os: 'win32', cpu: 'x64' }, + { rust: 'x86_64-unknown-linux-gnu', npm: 'linux-x64-gnu', os: 'linux', cpu: 'x64' } ]; for (const t of targets) { diff --git a/.gitignore b/.gitignore index fb0556b..2178610 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,11 @@ # Dependencies node_modules/ +# Expo +.expo/ +.expo-shared/ +.expo-devices + # Database opencontext.db *.db diff --git a/README.md b/README.md index 7c961e3..80462f9 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,20 @@ Stop repeating yourself. Start building smarter. </p> - <!-- Demo GIF --> - <img src="docs/images/folder-refer-git.gif" alt="OpenContext Demo" width="700"> + <p> + <strong>Bring your own coding agent.</strong> OpenContext reuses your existing CLI (Codex/Claude/OpenCode) and adds a GUI + built-in Skills/tools — no extra agent subscription. + </p> + + <table> + <tr> + <td> + <img src="docs/images/overview.png" alt="OpenContext Overview" height="260"> + </td> + <td> + <img src="docs/images/folder-refer-git.gif" alt="OpenContext Demo" height="260"> + </td> + </tr> + </table> <p> <a href="https://www.npmjs.com/package/@aicontextlab/cli"><img src="https://img.shields.io/npm/v/@aicontextlab/cli.svg?style=flat-square&color=cb3837" alt="npm version"></a> @@ -31,11 +43,13 @@ ## The Problem -When you use an AI assistant to build things, **context gets lost** (across days, repos, chats). You end up re-explaining background, repeating decisions, and sometimes the assistant continues with the wrong assumptions. +When you use an AI assistant to build things, **context gets lost** (across days, repos, chats). You end up re-explaining background, repeating decisions, and sometimes the assistant continues with the wrong assumptions. Most tools stop at storage and don't plug into the coding agent you already use. ## The Solution -OpenContext is a lightweight **personal context / knowledge store** for AI assistants (Agents) and Cursor users. Write down important project context as documents, and let your assistant "load history first, then act; ship, then persist". +OpenContext is a lightweight **personal context / knowledge store** for AI assistants (Agents) and coding tools like Cursor / Claude Code / Codex. It reuses your existing coding agent CLI (Codex/Claude/OpenCode) while adding a GUI plus built-in Skills/tools, so your agent can "load history first, then act; ship, then persist". + +**Skills-first support:** `oc init` generates user-level skills (Cursor/Claude Code/Codex) plus slash commands (Cursor/Claude Code), so agents can load, search, create, and iterate your context with one command. | Before OpenContext | After OpenContext | |-------------------|-------------------| @@ -46,10 +60,16 @@ OpenContext is a lightweight **personal context / knowledge store** for AI assis ## What's Included - **`oc` CLI** — manage a global `contexts/` library (folders/docs, manifests, search) -- **MCP Server** — so Cursor/Agents can call OpenContext as tools +- **MCP Server** — so Cursor/Claude Code/Codex/Agents can call OpenContext as tools +- **Skills + Slash Commands** — user-level skills for Cursor/Claude Code/Codex and slash commands for Cursor/Claude Code (generated by `oc init`) +- **Agent-ready Knowledge Layer** — reuse your existing coding agent CLI (Codex/Claude/OpenCode) with built-in skills/tools and GUI - **Desktop App** — manage/search/edit contexts with a native UI - **Web UI** — browse/edit contexts locally (no install required) +## Why OpenContext for Builders + +OpenContext's knowledge management Agent can **be the coding agent you already use** (Codex/Claude/OpenCode). You don't pay for a separate agent — you bring your own CLI and get a ready-to-use experience: a GUI for context management plus built-in Skills and tools that let the agent read, search, create, and iterate on your knowledge. + ## Quick Start ### Install CLI @@ -63,24 +83,40 @@ npm install -g @aicontextlab/cli | Path | Best For | Get Started | |------|----------|-------------| | 🖥️ **Desktop App** | Visual users who want a native UI | [Download from Releases](https://github.com/0xranx/OpenContext/releases) | -| ⌨️ **CLI + Cursor** | Developers using Cursor/AI agents | `npm install -g @aicontextlab/cli && oc init` | +| ⌨️ **CLI + Tools** | Developers using Cursor/Claude Code/Codex/AI agents | `npm install -g @aicontextlab/cli && oc init` | | 🔧 **CLI Only** | Power users, automation | `npm install -g @aicontextlab/cli` | -### 30-Second Setup (CLI + Cursor) +OpenContext works with the coding agent CLI you already have — it adds a GUI plus built-in Skills/tools instead of replacing your agent. + +### 30-Second Setup (CLI + Cursor/Claude Code/Codex) ```bash # 1. Install npm install -g @aicontextlab/cli -# 2. Initialize in your project +# 2. Initialize (prompts for tool setup; defaults to all) cd your-project oc init -# 3. Use slash commands in Cursor +# 3. Use slash commands (Cursor + Claude Code) # /opencontext-context — load background before working # /opencontext-search — find relevant docs # /opencontext-create — create a new doc # /opencontext-iterate — persist what you learned +# Tip: non-interactive installs can use --tools cursor,claude,codex or --no-claude/--no-cursor/--no-codex +# +# Installed by oc init: +# - Cursor: ~/.cursor/commands +# - Claude Code: ~/.claude/commands (or $CLAUDE_CONFIG_DIR/commands) +# Skills (wrapped from slash commands): +# - Cursor: ~/.cursor/skills/opencontext-*/SKILL.md +# - Claude Code: ~/.claude/skills/opencontext-*/SKILL.md (or $CLAUDE_CONFIG_DIR/skills) +# - Codex: ~/.codex/skills/opencontext-*/SKILL.md (or $CODEX_HOME/skills) +# +# 4. MCP config is user-level (Cursor/Claude Code/Codex) +# - Cursor: ~/.cursor/mcp.json +# - Claude Code: ~/.claude/mcp.json (or $CLAUDE_CONFIG_DIR/mcp.json) +# - Codex: ~/.codex/mcp.json (or $CODEX_HOME/mcp.json) ``` > 📖 **For detailed usage guide, search configuration, and FAQ, visit the [Website](https://0xranx.github.io/OpenContext/en/usage/).** @@ -93,14 +129,14 @@ Run `oc <cmd> --help` for details. | Command | What it does | |---------|--------------| -| `oc init` | Initialize OpenContext in your project | +| `oc init` | Initialize OpenContext + user-level tool integrations | | `oc folder ls` | List folders | | `oc folder create <path> -d "desc"` | Create a folder | | `oc doc create <folder> <name>.md -d "desc"` | Create a document | | `oc doc ls <folder>` | List documents | | `oc context manifest <folder>` | Generate file list for AI to read | | `oc search "query"` | Search documents | -| `oc mcp` | Start MCP server for Cursor | +| `oc mcp` | Start MCP server for MCP clients | | `oc ui` | Start local Web UI | > 📖 **Full command reference available on the [Website](https://0xranx.github.io/OpenContext/en/usage/).** @@ -128,4 +164,3 @@ npm run ui:build # production build ## License MIT © [OpenContext](https://github.com/0xranx/OpenContext) - diff --git a/README.zh-CN.md b/README.zh-CN.md index 002ce41..918e1f4 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -10,8 +10,20 @@ 不再重复解释,专注高效构建。 </p> - <!-- Demo GIF --> - <img src="docs/images/folder-refer-git.gif" alt="OpenContext Demo" width="700"> + <p> + <strong>复用你已有的 coding agent。</strong> OpenContext 直接接入你现有的 CLI(Codex/Claude/OpenCode),并提供 GUI + 内置 Skills/工具,无需额外为另一套 Agent 付费。 + </p> + + <table> + <tr> + <td> + <img src="docs/images/overview.png" alt="OpenContext 概览" height="260"> + </td> + <td> + <img src="docs/images/folder-refer-git.gif" alt="OpenContext Demo" height="260"> + </td> + </tr> + </table> <p> <a href="https://www.npmjs.com/package/@aicontextlab/cli"><img src="https://img.shields.io/npm/v/@aicontextlab/cli.svg?style=flat-square&color=cb3837" alt="npm version"></a> @@ -31,11 +43,13 @@ ## 痛点 -当你用 AI 助手做事时,**上下文会丢、历史决策会忘、跨天/跨仓库会断片**。你很容易重复解释背景、重复踩坑,甚至让 AI 在错误前提下继续执行。 +当你用 AI 助手做事时,**上下文会丢、历史决策会忘、跨天/跨仓库会断片**。你很容易重复解释背景、重复踩坑,甚至让 AI 在错误前提下继续执行。很多工具只停留在“管理”,并没有接入你已经在用的 coding agent。 ## 解决方案 -OpenContext 是一个面向 AI 助手(Agent)与 Cursor 用户的「个人上下文/知识库」。把重要的背景、决策、规范沉淀成文档,让 AI 助手能「先读历史再动手、做完再沉淀」。 +OpenContext 是一个面向 AI 助手(Agent)与 Cursor / Claude Code / Codex 等编码工具用户的「个人上下文/知识库」。它直接复用你已有的 coding agent CLI(Codex/Claude/OpenCode),并提供 GUI 与内置 Skills/工具,让 AI 助手能「先读历史再动手、做完再沉淀」。 + +**Skills 优先支持:** `oc init` 会生成用户级 skills(Cursor/Claude Code/Codex)和斜杠命令(Cursor/Claude Code),让 Agent 用一条命令完成加载、搜索、创建与迭代。 | 使用前 | 使用后 | |-------|-------| @@ -46,10 +60,16 @@ OpenContext 是一个面向 AI 助手(Agent)与 Cursor 用户的「个人上 ## 包含什么 - **`oc` CLI** — 管理全局 `contexts/` 文档库(目录/文档、清单、检索) -- **MCP Server** — 让 Cursor/Agent 通过工具调用 OpenContext +- **MCP Server** — 让 Cursor/Claude Code/Codex/Agent 通过工具调用 OpenContext +- **Skills + 斜杠命令** — 为 Cursor/Claude Code/Codex 生成用户级 skills,为 Cursor/Claude Code 生成斜杠命令(由 `oc init` 生成) +- **面向 Agent 的知识层** — 复用你已有的 coding agent CLI(Codex/Claude/OpenCode),并内置 Skills/工具 + GUI - **桌面版应用** — 用原生 UI 管理/搜索/编辑 contexts - **Web UI** — 本地浏览/编辑文档(无需安装桌面版) +## 为什么 OpenContext 更适合开发者 + +OpenContext 的知识管理 Agent 可以**直接用你已经在用的 coding agent CLI**(Codex/Claude/OpenCode),不需要为另一套 Agent 再付费。你带来自己熟悉的代理工具,OpenContext 直接提供现成 GUI 和内置 Skills/工具,让 Agent 能读、搜、写、迭代你的知识库。 + ## 快速开始 ### 安装 CLI @@ -63,24 +83,40 @@ npm install -g @aicontextlab/cli | 路径 | 适合人群 | 开始使用 | |-----|---------|---------| | 🖥️ **桌面版应用** | 喜欢图形界面的用户 | [从 Releases 下载](https://github.com/0xranx/OpenContext/releases) | -| ⌨️ **CLI + Cursor** | 使用 Cursor/AI Agent 的开发者 | `npm install -g @aicontextlab/cli && oc init` | +| ⌨️ **CLI + 工具接入** | 使用 Cursor/Claude Code/Codex/AI Agent 的开发者 | `npm install -g @aicontextlab/cli && oc init` | | 🔧 **仅 CLI** | 高级用户、自动化场景 | `npm install -g @aicontextlab/cli` | -### 30 秒上手(CLI + Cursor) +OpenContext 不替换你的 Agent,而是复用你已有的 coding agent CLI,并补上 GUI 与内置 Skills/工具。 + +### 30 秒上手(CLI + Cursor/Claude Code/Codex) ```bash # 1. 安装 npm install -g @aicontextlab/cli -# 2. 在你的项目中初始化 +# 2. 初始化(会提示选择工具,默认全选) cd your-project oc init -# 3. 在 Cursor 中使用斜杠命令 +# 3. 在 Cursor / Claude Code 中使用斜杠命令 # /opencontext-context — 开始工作前加载背景 # /opencontext-search — 查找相关文档 # /opencontext-create — 创建新文档 # /opencontext-iterate — 沉淀学到的内容 +# 提示:非交互可用 --tools cursor,claude,codex 或 --no-claude/--no-cursor/--no-codex +# +# oc init 会安装: +# - Cursor: ~/.cursor/commands +# - Claude Code: ~/.claude/commands(或 $CLAUDE_CONFIG_DIR/commands) +# Skills(斜杠命令的同名封装): +# - Cursor: ~/.cursor/skills/opencontext-*/SKILL.md +# - Claude Code: ~/.claude/skills/opencontext-*/SKILL.md(或 $CLAUDE_CONFIG_DIR/skills) +# - Codex: ~/.codex/skills/opencontext-*/SKILL.md(或 $CODEX_HOME/skills) +# +# 用户级 MCP 配置: +# - Cursor: ~/.cursor/mcp.json +# - Claude Code: ~/.claude/mcp.json(或 $CLAUDE_CONFIG_DIR/mcp.json) +# - Codex: ~/.codex/mcp.json(或 $CODEX_HOME/mcp.json) ``` > 📖 **详细使用指南、搜索配置和常见问题,请访问[官网](https://0xranx.github.io/OpenContext/zh/usage/)。** @@ -93,14 +129,14 @@ oc init | 命令 | 说明 | |-----|------| -| `oc init` | 在项目中初始化 OpenContext | +| `oc init` | 初始化 OpenContext + 用户级工具集成 | | `oc folder ls` | 列出目录 | | `oc folder create <path> -d "desc"` | 创建目录 | | `oc doc create <folder> <name>.md -d "desc"` | 创建文档 | | `oc doc ls <folder>` | 列出文档 | | `oc context manifest <folder>` | 生成文档清单供 AI 读取 | | `oc search "query"` | 搜索文档 | -| `oc mcp` | 启动 MCP Server(给 Cursor 用) | +| `oc mcp` | 启动 MCP Server(给 MCP 客户端用) | | `oc ui` | 启动本地 Web UI | > 📖 **完整命令参考请访问[官网](https://0xranx.github.io/OpenContext/zh/usage/)。** diff --git a/bin/oc.js b/bin/oc.js index 6c145cc..6e90e12 100755 --- a/bin/oc.js +++ b/bin/oc.js @@ -152,16 +152,147 @@ function openInEditor(filePath) { } } +const TOOL_LABELS = { + cursor: 'Cursor', + claude: 'Claude Code', + codex: 'Codex' +}; +const TOOL_ALIASES = { + '1': 'cursor', + '2': 'claude', + '3': 'codex', + cursor: 'cursor', + claude: 'claude', + 'claude-code': 'claude', + 'claude_code': 'claude', + codex: 'codex' +}; +const DEFAULT_TOOL_SELECTION = { + cursor: true, + claude: true, + codex: true +}; + +function parseToolSelection(input) { + const tokens = String(input || '') + .split(/[, ]+/) + .map((t) => t.trim().toLowerCase()) + .filter(Boolean); + + if (tokens.length === 0) { + return { selection: { ...DEFAULT_TOOL_SELECTION }, unknown: [] }; + } + + if (tokens.includes('all')) { + return { selection: { ...DEFAULT_TOOL_SELECTION }, unknown: [] }; + } + + if (tokens.includes('none')) { + return { selection: { cursor: false, claude: false, codex: false }, unknown: [] }; + } + + const selection = { cursor: false, claude: false, codex: false }; + const unknown = []; + + tokens.forEach((token) => { + const key = TOOL_ALIASES[token]; + if (!key) { + unknown.push(token); + return; + } + selection[key] = true; + }); + + return { selection, unknown }; +} + +function applyToolFlags(selection, options) { + const result = { ...selection }; + if (options.cursor === false) result.cursor = false; + if (options.claude === false) result.claude = false; + if (options.codex === false) result.codex = false; + return result; +} + +function summarizeSelection(selection) { + return Object.keys(TOOL_LABELS) + .filter((key) => selection[key]) + .map((key) => TOOL_LABELS[key]); +} + +async function promptForToolSelection() { + const readline = require('readline'); + const prompt = + 'Select tools to configure (1=Cursor, 2=Claude Code, 3=Codex; default: all): '; + while (true) { + const answer = await new Promise((resolve) => { + const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); + rl.question(prompt, (input) => { + rl.close(); + resolve(input); + }); + }); + if (!String(answer || '').trim()) { + return { ...DEFAULT_TOOL_SELECTION }; + } + const parsed = parseToolSelection(answer); + if (parsed.unknown.length === 0) { + return parsed.selection; + } + console.log(`Invalid selection: ${parsed.unknown.join(', ')}. Try again.`); + } +} + +async function resolveToolSelection(options) { + let selection = { ...DEFAULT_TOOL_SELECTION }; + let hasExplicit = false; + + if (options.tools) { + const parsed = parseToolSelection(options.tools); + if (parsed.unknown.length > 0) { + throw new Error(`Invalid --tools entries: ${parsed.unknown.join(', ')}`); + } + selection = parsed.selection; + hasExplicit = true; + } + + if (options.cursor === false || options.claude === false || options.codex === false) { + selection = applyToolFlags(selection, options); + hasExplicit = true; + } + + if (hasExplicit) { + return selection; + } + + if (!process.stdin.isTTY || process.env.CI) { + return selection; + } + + return promptForToolSelection(); +} + program .command('init') .description('Initialize contexts directory and database') + .option('--tools <list>', 'Tools to configure (cursor, claude, codex; default: all)') + .option('--no-cursor', 'Skip Cursor setup') + .option('--no-claude', 'Skip Claude Code setup') + .option('--no-codex', 'Skip Codex setup') .action( - handle(() => { + handle(async (options) => { const info = store.initEnvironment(); console.log(`Contexts directory ready at ${info.contextsRoot}`); console.log(`Database ready at ${info.dbPath}`); const projectRoot = process.cwd(); - const outputs = syncAgentsArtifacts(projectRoot); + const tools = await resolveToolSelection(options); + const selected = summarizeSelection(tools); + if (selected.length === 0) { + console.log('No tool configuration selected; skipping slash commands and MCP config.'); + } else { + console.log(`Tool setup: ${selected.join(', ')}`); + } + const outputs = syncAgentsArtifacts(projectRoot, { tools }); if (outputs.length) { outputs.forEach((file) => console.log(`Synced instructions: ${file}`)); } @@ -390,15 +521,29 @@ program .action( handle((folderPath, options) => { const effectiveFolder = folderPath === undefined ? '.' : folderPath; - const limit = options.limit !== undefined ? Number(options.limit) : null; - const rows = store.generateManifest({ folderPath: effectiveFolder, limit }); + const limit = options.limit !== undefined ? Number(options.limit) : undefined; + const result = store.generateManifest({ folderPath: effectiveFolder, limit }); + const rows = result.items; + const unindexed = result.unindexed_files || []; const format = options.llm ? 'llm' : (options.format || 'json'); if (format === 'json') { - console.log(JSON.stringify(rows, null, 2)); + console.log(JSON.stringify(result, null, 2)); + if (unindexed.length > 0) { + console.error( + `\n⚠️ ${unindexed.length} files exist on disk but are not indexed. ` + + `Run \`oc index reconcile ${effectiveFolder}\` to register them.` + ); + } return; } if (format === 'llm') { console.log(renderManifestLlm({ folderPath: effectiveFolder, limit, rows })); + if (unindexed.length > 0) { + console.error( + `\n⚠️ ${unindexed.length} unindexed files: ${unindexed.join(', ')}\n` + + ` Run \`oc index reconcile ${effectiveFolder}\`.` + ); + } return; } throw new Error(`Unknown format "${format}". Supported: json, llm`); @@ -563,6 +708,36 @@ indexCmd }) ); +indexCmd + .command('reconcile') + .argument('[folder]', 'Folder to reconcile (default: all root folders)') + .description('Register *.md files that exist on disk but are missing from the SQLite index. Does NOT rebuild embeddings (use `oc index build` for that).') + .action( + handle((folder) => { + const folders = folder + ? [folder] + : store.listFolders({ all: false }).map((f) => f.rel_path); + + let total = 0; + for (const f of folders) { + const added = store.reconcileFolder({ folderPath: f }); + if (added.length === 0) { + console.log(`✅ ${f}: nothing to reconcile`); + } else { + console.log(`📥 ${f}: registered ${added.length} file(s)`); + for (const rel of added) { + console.log(` + ${rel}`); + } + } + total += added.length; + } + if (total > 0) { + console.log(`\nDone. ${total} doc(s) added to the index.`); + console.log('Run `oc index build` to (re)compute embeddings.'); + } + }) + ); + indexCmd .command('clean') .description('Clean/reset the search index completely') diff --git a/crates/opencontext-core/src/lib.rs b/crates/opencontext-core/src/lib.rs index 639d84f..ca7ac55 100644 --- a/crates/opencontext-core/src/lib.rs +++ b/crates/opencontext-core/src/lib.rs @@ -6,7 +6,11 @@ mod tests; use chrono::{SecondsFormat, Utc}; use parking_lot::Mutex; use rusqlite::{params, Connection, OptionalExtension}; -use std::{env, fs, path::PathBuf, sync::Arc}; +use std::{ + env, fs, + path::{Path, PathBuf}, + sync::Arc, +}; use thiserror::Error; // Events module (enabled with "search" feature) @@ -89,6 +93,16 @@ pub struct DocManifestEntry { pub updated_at: String, } +/// Manifest response that also surfaces filesystem files which are NOT +/// registered in SQLite (i.e. created via `Write`/`Edit` bypassing the API). +/// `unindexed_files` is the list of relative paths (under the requested +/// folder) of `*.md` files that exist on disk but have no `docs` row. +#[derive(Debug, Clone, serde::Serialize)] +pub struct ManifestResult { + pub items: Vec<DocManifestEntry>, + pub unindexed_files: Vec<String>, +} + impl OpenContext { pub fn initialize(overrides: EnvOverrides) -> CoreResult<Self> { let base_root = overrides @@ -317,7 +331,7 @@ impl OpenContext { if parent.is_empty() { new_name.to_string() } else { - format!("{}/{}", parent, new_name) + format!("{parent}/{new_name}") } } else { new_name.to_string() @@ -361,7 +375,7 @@ impl OpenContext { .collect::<Result<Vec<_>, _>>()?; for (id, child_rel) in folder_rows { let suffix = &child_rel[folder.rel_path.len() + 1..]; - let updated_rel = format!("{}/{}", new_rel_path, suffix); + let updated_rel = format!("{new_rel_path}/{suffix}"); let updated_abs = self.contexts_root.join(&updated_rel); tx.execute( "UPDATE folders SET rel_path = ?1, abs_path = ?2, updated_at = ?3 WHERE id = ?4", @@ -377,7 +391,7 @@ impl OpenContext { .collect::<Result<Vec<_>, _>>()?; for (id, doc_rel) in doc_rows { let suffix = &doc_rel[folder.rel_path.len() + 1..]; - let updated_rel = format!("{}/{}", new_rel_path, suffix); + let updated_rel = format!("{new_rel_path}/{suffix}"); let updated_abs = self.contexts_root.join(&updated_rel); tx.execute( "UPDATE docs SET rel_path = ?1, abs_path = ?2, updated_at = ?3 WHERE id = ?4", @@ -426,7 +440,7 @@ impl OpenContext { "Root is not supported. Please move into a folder under contexts/.".into(), )); } - if dest_rel_folder == rel_path || dest_rel_folder.starts_with(&format!("{}/", rel_path)) { + if dest_rel_folder == rel_path || dest_rel_folder.starts_with(&format!("{rel_path}/")) { return Err(CoreError::Message( "Cannot move a folder into itself or its descendants.".into(), )); @@ -492,7 +506,7 @@ impl OpenContext { .collect::<Result<Vec<_>, _>>()?; for (id, child_rel) in folder_rows { let suffix = &child_rel[folder.rel_path.len() + 1..]; - let updated_rel = format!("{}/{}", new_rel_path, suffix); + let updated_rel = format!("{new_rel_path}/{suffix}"); let updated_abs = self.contexts_root.join(&updated_rel); tx.execute( "UPDATE folders SET rel_path = ?1, abs_path = ?2, updated_at = ?3 WHERE id = ?4", @@ -509,7 +523,7 @@ impl OpenContext { .collect::<Result<Vec<_>, _>>()?; for (id, doc_rel) in doc_rows { let suffix = &doc_rel[folder.rel_path.len() + 1..]; - let updated_rel = format!("{}/{}", new_rel_path, suffix); + let updated_rel = format!("{new_rel_path}/{suffix}"); let updated_abs = self.contexts_root.join(&updated_rel); tx.execute( "UPDATE docs SET rel_path = ?1, abs_path = ?2, updated_at = ?3 WHERE id = ?4", @@ -586,7 +600,7 @@ impl OpenContext { "Folder \"{rel_path}\" is not empty. Use --force to delete recursively." ))); } - let like_pattern = format!("{}/%", rel_path); + let like_pattern = format!("{rel_path}/%"); let tx = conn.unchecked_transaction()?; tx.execute( "DELETE FROM docs WHERE rel_path LIKE ?1", @@ -792,7 +806,7 @@ impl OpenContext { let folder_rel = parent_rel_path(&doc.rel_path); let new_rel_path = folder_rel .and_then(|p| if p.is_empty() { None } else { Some(p) }) - .map(|prefix| format!("{}/{}", prefix, new_name)) + .map(|prefix| format!("{prefix}/{new_name}")) .unwrap_or_else(|| new_name.to_string()); if self.find_doc(&new_rel_path)?.is_some() { return Err(CoreError::Message(format!( @@ -971,6 +985,132 @@ impl OpenContext { }) } + /// Like `generate_manifest`, but also scans the filesystem and returns + /// any `*.md` files that exist on disk under the folder but are NOT + /// registered in the `docs` table. Manifest itself remains read-only — + /// nothing is inserted; the caller is expected to surface a warning + /// and (optionally) invoke `reconcile_folder` to fix the drift. + pub fn generate_manifest_full( + &self, + folder_path: &str, + limit: Option<usize>, + ) -> CoreResult<ManifestResult> { + let items = self.generate_manifest(folder_path, limit)?; + + let rel_path = normalize_folder_path(Some(folder_path))?; + let folder = self + .find_folder(&rel_path)? + .ok_or_else(|| folder_not_found(&rel_path))?; + + // Collect rel_paths of every *.md file under the folder. + let mut on_disk: Vec<String> = Vec::new(); + if folder.abs_path.is_dir() { + scan_md_files(&folder.abs_path, &self.contexts_root, &mut on_disk)?; + } + + // Subtract everything that is already in the DB for this folder + // (use a fresh full SELECT — `items` may be limited). + let known: std::collections::HashSet<String> = self.with_conn(|conn| { + let pattern = if folder.rel_path.is_empty() { + "%".to_string() + } else { + format!("{}/%", folder.rel_path) + }; + let mut stmt = conn.prepare("SELECT rel_path FROM docs WHERE rel_path LIKE ?1")?; + let rows = stmt + .query_map([pattern], |row| row.get::<_, String>(0))? + .collect::<Result<Vec<_>, _>>()?; + Ok(rows.into_iter().collect()) + })?; + + let mut unindexed_files: Vec<String> = + on_disk.into_iter().filter(|p| !known.contains(p)).collect(); + unindexed_files.sort(); + + Ok(ManifestResult { + items, + unindexed_files, + }) + } + + /// Walk the filesystem under `folder_path` and register any `*.md` + /// files that are not yet present in the `docs` table. Does NOT touch + /// embeddings / LanceDB — that's a separate (slow) step via + /// `oc index build`. Returns the list of newly registered rel_paths. + pub fn reconcile_folder(&self, folder_path: &str) -> CoreResult<Vec<String>> { + let rel_path = normalize_folder_path(Some(folder_path))?; + let folder = self + .find_folder(&rel_path)? + .ok_or_else(|| folder_not_found(&rel_path))?; + + let mut on_disk: Vec<String> = Vec::new(); + if folder.abs_path.is_dir() { + scan_md_files(&folder.abs_path, &self.contexts_root, &mut on_disk)?; + } + + let known: std::collections::HashSet<String> = self.with_conn(|conn| { + let pattern = if folder.rel_path.is_empty() { + "%".to_string() + } else { + format!("{}/%", folder.rel_path) + }; + let mut stmt = conn.prepare("SELECT rel_path FROM docs WHERE rel_path LIKE ?1")?; + let rows = stmt + .query_map([pattern], |row| row.get::<_, String>(0))? + .collect::<Result<Vec<_>, _>>()?; + Ok(rows.into_iter().collect()) + })?; + + let mut added: Vec<String> = Vec::new(); + for doc_rel in on_disk { + if known.contains(&doc_rel) { + continue; + } + let parent_rel = parent_rel_path(&doc_rel).unwrap_or_default(); + if parent_rel.is_empty() { + // Root-level docs are not representable in the schema + // (folders.rel_path = '' has no row). Skip silently. + continue; + } + let parent_folder = self + .ensure_folder_record(&parent_rel)? + .ok_or_else(|| folder_not_found(&parent_rel))?; + let name = doc_rel + .split('/') + .next_back() + .unwrap_or(&doc_rel) + .to_string(); + let abs_path = self.contexts_root.join(&doc_rel); + let ts = now_iso(); + self.with_conn(|conn| { + let sid = generate_stable_id(conn)?; + conn.execute( + "INSERT INTO docs (folder_id, name, rel_path, abs_path, description, stable_id, created_at, updated_at) + VALUES (?1, ?2, ?3, ?4, '', ?5, ?6, ?6)", + params![ + parent_folder.id, + name, + doc_rel, + abs_path.to_string_lossy(), + sid, + ts + ], + )?; + Ok(()) + })?; + + #[cfg(feature = "search")] + self.emit_doc_event(DocEvent::Created { + rel_path: doc_rel.clone(), + }); + + added.push(doc_rel); + } + + added.sort(); + Ok(added) + } + fn find_folder(&self, rel_path: &str) -> CoreResult<Option<Folder>> { self.with_conn(|conn| { let mut stmt = conn.prepare( @@ -1135,6 +1275,40 @@ fn parent_rel_path(rel_path: &str) -> Option<String> { } } +/// Recursively walk `dir` and append rel_paths (relative to `contexts_root`) +/// of every `*.md` file. Hidden directories (starting with `.`) and any +/// non-utf8 paths are skipped. +fn scan_md_files(dir: &Path, contexts_root: &Path, out: &mut Vec<String>) -> CoreResult<()> { + for entry in fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + let file_name = match entry.file_name().into_string() { + Ok(n) => n, + Err(_) => continue, + }; + if file_name.starts_with('.') { + continue; + } + let file_type = entry.file_type()?; + if file_type.is_dir() { + scan_md_files(&path, contexts_root, out)?; + } else if file_type.is_file() + && path + .extension() + .and_then(|e| e.to_str()) + .map(|e| e.eq_ignore_ascii_case("md")) + .unwrap_or(false) + { + if let Ok(rel) = path.strip_prefix(contexts_root) { + if let Some(s) = rel.to_str() { + out.push(s.replace('\\', "/")); + } + } + } + } + Ok(()) +} + fn folder_not_found(rel_path: &str) -> CoreError { CoreError::Message(format!( "Folder \"{rel_path}\" does not exist. Use \"oc folder create {rel_path}\" first." @@ -1224,7 +1398,7 @@ fn generate_stable_id(conn: &Connection) -> CoreResult<String> { // UUID v4 variant/version bits b[6] = (b[6] & 0x0f) | 0x40; b[8] = (b[8] & 0x3f) | 0x80; - let hex = b.iter().map(|v| format!("{:02x}", v)).collect::<String>(); + let hex = b.iter().map(|v| format!("{v:02x}")).collect::<String>(); Ok(format!( "{}-{}-{}-{}-{}", &hex[0..8], diff --git a/crates/opencontext-core/src/search/embedding.rs b/crates/opencontext-core/src/search/embedding.rs index 457c3d6..cecb18c 100644 --- a/crates/opencontext-core/src/search/embedding.rs +++ b/crates/opencontext-core/src/search/embedding.rs @@ -127,9 +127,10 @@ impl EmbeddingClient { let input_count = texts.len(); // Truncate texts that are too long (most embedding APIs have ~8K token limit) - // Using char count as approximation: ~4 chars per token for English, ~1-2 for Chinese - // Set conservative limit to avoid API silently dropping texts - const MAX_CHARS: usize = 8000; + // Using char count as approximation: ~4 chars per token for English, ~1-2 for CJK/Cyrillic + // nomic-embed-text and similar models have 8192 token limit + // Conservative limit: 2000 chars (safe for all languages including Cyrillic/CJK) + const MAX_CHARS: usize = 2000; let texts: Vec<String> = texts .into_iter() .map(|t| { diff --git a/crates/opencontext-core/src/search/indexer.rs b/crates/opencontext-core/src/search/indexer.rs index 9530bce..7624df9 100644 --- a/crates/opencontext-core/src/search/indexer.rs +++ b/crates/opencontext-core/src/search/indexer.rs @@ -1,11 +1,7 @@ //! Document indexer -use std::collections::HashMap; use std::path::PathBuf; -use regex::Regex; -use urlencoding::decode; - use super::chunker::Chunker; use super::config::SearchConfig; use super::embedding::EmbeddingClient; @@ -13,13 +9,6 @@ use super::error::{SearchError, SearchResult}; use super::types::Chunk; use super::vector_store::VectorStore; -#[derive(Clone)] -struct DocInfo { - name: String, - rel_path: String, - description: String, -} - #[derive(Clone)] struct IdeaEntry { id: String, @@ -27,6 +16,8 @@ struct IdeaEntry { content: String, } +const DEFAULT_IDEA_BOX: &str = "inbox"; + fn parse_idea_marker(line: &str) -> Option<(String, String)> { let trimmed = line.trim(); if !trimmed.starts_with("[//]: # (") || !trimmed.ends_with(')') { @@ -84,102 +75,24 @@ fn parse_idea_entries(content: &str) -> Vec<IdeaEntry> { entries } -fn extract_refs(text: &str) -> Vec<(String, String)> { - let regex = Regex::new(r"\[([^\]]+)\]\((oc://[^)]+)\)").unwrap(); - regex - .captures_iter(text) - .map(|cap| (cap[1].to_string(), cap[2].to_string())) - .collect() -} - -fn parse_doc_href(href: &str) -> (Option<String>, Option<String>) { - if !href.starts_with("oc://doc/") { - return (None, None); - } - let raw = href.trim_start_matches("oc://doc/"); - let mut stable_id = raw.to_string(); - let mut path_param: Option<String> = None; - if let Some((id, query)) = raw.split_once('?') { - stable_id = id.to_string(); - if let Some(path) = query.split('&').find_map(|pair| { - let mut iter = pair.splitn(2, '='); - match (iter.next(), iter.next()) { - (Some("path"), Some(value)) => Some(value.to_string()), - _ => None, - } - }) { - if let Ok(decoded) = decode(&path) { - path_param = Some(decoded.to_string()); - } - } - } - let stable_id = if stable_id.is_empty() { - None - } else { - Some(stable_id) - }; - (stable_id, path_param) -} - -fn append_reference_summary( - text: &str, - doc_by_stable: &HashMap<String, DocInfo>, - doc_by_path: &HashMap<String, DocInfo>, -) -> String { - let refs = extract_refs(text); - if refs.is_empty() { - return text.to_string(); +fn extract_idea_box(rel_path: &str) -> Option<String> { + let normalized = rel_path.trim_start_matches("./"); + if !normalized.starts_with(".ideas/") { + return None; } - - let mut lines: Vec<String> = Vec::new(); - for (label, href) in refs { - if href.starts_with("oc://doc/") { - let (stable_id, path) = parse_doc_href(&href); - let meta = stable_id - .as_ref() - .and_then(|id| doc_by_stable.get(id)) - .cloned() - .or_else(|| path.as_ref().and_then(|p| doc_by_path.get(p)).cloned()); - let title = if !label.is_empty() { - label - } else { - meta.as_ref() - .map(|m| m.name.clone()) - .unwrap_or_else(|| "文档".to_string()) - }; - let summary = meta - .as_ref() - .map(|m| { - let mut parts = Vec::new(); - if !m.description.is_empty() { - parts.push(m.description.clone()); - } - if !m.rel_path.is_empty() { - parts.push(m.rel_path.clone()); - } - parts.join(" · ") - }) - .unwrap_or_default(); - if summary.is_empty() { - lines.push(format!("文档: {}", title)); + let rest = &normalized[".ideas/".len()..]; + let mut parts = rest.split('/').filter(|p| !p.is_empty()); + let first = parts.next(); + match first { + None => Some(DEFAULT_IDEA_BOX.to_string()), + Some(seg) => { + if seg.len() == 4 && seg.chars().all(|c| c.is_ascii_digit()) { + Some(DEFAULT_IDEA_BOX.to_string()) } else { - lines.push(format!("文档: {} — {}", title, summary)); + Some(seg.to_string()) } - } else if href.starts_with("oc://idea/") { - let title = if !label.is_empty() { - label - } else { - "想法".to_string() - }; - lines.push(format!("想法: {}", title)); } } - - if lines.is_empty() { - return text.to_string(); - } - - format!("{text}\n\n引用:\n- {}", lines.join("\n- ")) } /// Index build statistics @@ -290,18 +203,6 @@ impl Indexer { let mut total_chunks = 0; let mut processed_docs = 0; - let mut doc_by_stable: HashMap<String, DocInfo> = HashMap::new(); - let mut doc_by_path: HashMap<String, DocInfo> = HashMap::new(); - for doc in &docs { - let info = DocInfo { - name: doc.name.clone(), - rel_path: doc.rel_path.clone(), - description: doc.description.clone(), - }; - doc_by_stable.insert(doc.stable_id.clone(), info.clone()); - doc_by_path.insert(doc.rel_path.clone(), info); - } - // Reset existing index self.vector_store.reset().await?; @@ -325,6 +226,16 @@ impl Indexer { }); for doc in batch { + // Skip files that no longer exist on disk (orphaned DB records) + if !std::path::Path::new(&doc.abs_path).exists() { + log::warn!( + "Skipping missing file during indexing: {} (orphaned DB record?)", + doc.rel_path + ); + processed_docs += 1; + continue; + } + let content = std::fs::read_to_string(&doc.abs_path)?; if content.trim().is_empty() { processed_docs += 1; @@ -333,6 +244,7 @@ impl Indexer { if doc.rel_path.starts_with(".ideas/") { let entries = parse_idea_entries(&content); + let idea_box = extract_idea_box(&doc.rel_path); for (i, entry) in entries.into_iter().enumerate() { let entry_date = entry.created_at.get(0..10).unwrap_or("").to_string(); let title_line = entry @@ -342,13 +254,11 @@ impl Indexer { .unwrap_or("") .trim() .to_string(); - let entry_content = - append_reference_summary(&entry.content, &doc_by_stable, &doc_by_path); let id = format!("{}#{}", doc.rel_path, entry.id); all_chunks.push(Chunk { id, file_path: doc.rel_path.clone(), - content: entry_content, + content: entry.content, heading_path: String::new(), section_title: if title_line.is_empty() { None @@ -363,6 +273,7 @@ impl Indexer { Some(entry_date) }, entry_created_at: Some(entry.created_at), + idea_box: idea_box.clone(), chunk_index: i, vector: vec![], // Will be filled below }); @@ -382,6 +293,7 @@ impl Indexer { entry_id: None, entry_date: None, entry_created_at: None, + idea_box: None, chunk_index: i, vector: vec![], // Will be filled below }); @@ -478,6 +390,7 @@ impl Indexer { if rel_path.starts_with(".ideas/") { let entries = parse_idea_entries(&content); + let idea_box = extract_idea_box(rel_path); for (i, entry) in entries.into_iter().enumerate() { let entry_date = entry.created_at.get(0..10).unwrap_or("").to_string(); let title_line = entry @@ -506,6 +419,7 @@ impl Indexer { Some(entry_date) }, entry_created_at: Some(entry.created_at), + idea_box: idea_box.clone(), chunk_index: i, vector: vec![], }); @@ -524,6 +438,7 @@ impl Indexer { entry_id: None, entry_date: None, entry_created_at: None, + idea_box: None, chunk_index: i, vector: vec![], }); diff --git a/crates/opencontext-core/src/search/searcher.rs b/crates/opencontext-core/src/search/searcher.rs index e34342d..3f2860b 100644 --- a/crates/opencontext-core/src/search/searcher.rs +++ b/crates/opencontext-core/src/search/searcher.rs @@ -505,6 +505,7 @@ impl Searcher { entry_id: None, entry_date: None, entry_created_at: None, + idea_box: doc.top_chunk.idea_box, } }) .collect(); @@ -600,6 +601,7 @@ impl Searcher { entry_id: None, entry_date: None, entry_created_at: None, + idea_box: folder.top_chunk.idea_box, } }) .collect(); diff --git a/crates/opencontext-core/src/search/types.rs b/crates/opencontext-core/src/search/types.rs index 7ef11a6..fc3a92c 100644 --- a/crates/opencontext-core/src/search/types.rs +++ b/crates/opencontext-core/src/search/types.rs @@ -28,6 +28,9 @@ pub struct Chunk { /// Entry created timestamp (ISO8601) #[serde(skip_serializing_if = "Option::is_none")] pub entry_created_at: Option<String>, + /// Ideas box name (e.g. "inbox") + #[serde(skip_serializing_if = "Option::is_none")] + pub idea_box: Option<String>, /// Index of this chunk within the document pub chunk_index: usize, /// Embedding vector @@ -164,6 +167,9 @@ pub struct SearchHit { /// Entry created timestamp (ISO8601) #[serde(skip_serializing_if = "Option::is_none")] pub entry_created_at: Option<String>, + /// Ideas box name (e.g. "inbox") + #[serde(skip_serializing_if = "Option::is_none")] + pub idea_box: Option<String>, } /// Search results response diff --git a/crates/opencontext-core/src/search/vector_store.rs b/crates/opencontext-core/src/search/vector_store.rs index be639df..c4a9765 100644 --- a/crates/opencontext-core/src/search/vector_store.rs +++ b/crates/opencontext-core/src/search/vector_store.rs @@ -87,6 +87,7 @@ impl VectorStore { Field::new("entry_id", DataType::Utf8, true), Field::new("entry_date", DataType::Utf8, true), Field::new("entry_created_at", DataType::Utf8, true), + Field::new("idea_box", DataType::Utf8, true), Field::new("chunk_index", DataType::UInt32, false), Field::new( "vector", @@ -117,22 +118,21 @@ impl VectorStore { // Wrap in iterator let batches = RecordBatchIterator::new(vec![Ok(batch)], schema.clone()); - if self.table.is_none() { - // Create new table - let table = db - .create_table(TABLE_NAME, Box::new(batches)) + if let Some(table) = self.table.as_ref() { + // Add to existing table + table + .add(Box::new(batches)) .execute() .await .map_err(SearchError::Lance)?; - self.table = Some(table); } else { - // Add to existing table - let table = self.table.as_ref().unwrap(); - table - .add(Box::new(batches)) + // Create new table + let table = db + .create_table(TABLE_NAME, Box::new(batches)) .execute() .await .map_err(SearchError::Lance)?; + self.table = Some(table); } Ok(count) @@ -164,6 +164,10 @@ impl VectorStore { .iter() .map(|c| c.entry_created_at.as_deref().unwrap_or("")) .collect(); + let idea_boxes: Vec<&str> = chunks + .iter() + .map(|c| c.idea_box.as_deref().unwrap_or("")) + .collect(); let chunk_indices: Vec<u32> = chunks.iter().map(|c| c.chunk_index as u32).collect(); let vectors_array = FixedSizeListArray::from_iter_primitive::<Float32Type, _, _>( @@ -185,6 +189,7 @@ impl VectorStore { Arc::new(StringArray::from(entry_ids)), Arc::new(StringArray::from(entry_dates)), Arc::new(StringArray::from(entry_created_ats)), + Arc::new(StringArray::from(idea_boxes)), Arc::new(UInt32Array::from(chunk_indices)), Arc::new(vectors_array), ], @@ -250,6 +255,10 @@ impl VectorStore { .column_by_name("entry_created_at") .and_then(|c| c.as_any().downcast_ref::<StringArray>()); + let idea_boxes = batch + .column_by_name("idea_box") + .and_then(|c| c.as_any().downcast_ref::<StringArray>()); + let line_starts = batch .column_by_name("line_start") .and_then(|c| c.as_any().downcast_ref::<arrow_array::Int64Array>()); @@ -317,6 +326,15 @@ impl VectorStore { } }); + let idea_box = idea_boxes.and_then(|arr| { + let val = arr.value(i); + if val.is_empty() { + None + } else { + Some(val.to_string()) + } + }); + let line_start = line_starts.map(|arr| arr.value(i) as usize); let line_end = line_ends.map(|arr| arr.value(i) as usize); @@ -366,6 +384,7 @@ impl VectorStore { entry_id, entry_date, entry_created_at, + idea_box, }); } } @@ -478,6 +497,10 @@ impl VectorStore { .column_by_name("entry_created_at") .and_then(|c| c.as_any().downcast_ref::<StringArray>()); + let idea_boxes = batch + .column_by_name("idea_box") + .and_then(|c| c.as_any().downcast_ref::<StringArray>()); + let line_starts = batch .column_by_name("line_start") .and_then(|c| c.as_any().downcast_ref::<arrow_array::Int64Array>()); @@ -542,6 +565,15 @@ impl VectorStore { } }); + let idea_box = idea_boxes.and_then(|arr| { + let val = arr.value(i); + if val.is_empty() { + None + } else { + Some(val.to_string()) + } + }); + let line_start = line_starts.map(|arr| arr.value(i) as usize); let line_end = line_ends.map(|arr| arr.value(i) as usize); @@ -584,6 +616,7 @@ impl VectorStore { entry_id, entry_date, entry_created_at, + idea_box, }); } } diff --git a/crates/opencontext-core/src/tests.rs b/crates/opencontext-core/src/tests.rs index 4ada394..9993d2f 100644 --- a/crates/opencontext-core/src/tests.rs +++ b/crates/opencontext-core/src/tests.rs @@ -729,4 +729,78 @@ mod manifest_tests { assert!(!entry.updated_at.is_empty()); assert!(entry.abs_path.to_string_lossy().contains("folder/doc.md")); } + + #[test] + fn test_generate_manifest_full_detects_unindexed_files() { + let (ctx, _temp) = create_test_context(); + ctx.create_folder("folder", None).unwrap(); + ctx.create_doc("folder", "indexed.md", None).unwrap(); + + // Bypass the API and write a file straight to disk. + let abs = ctx.env_info().contexts_root.join("folder/orphan.md"); + std::fs::write(&abs, "# orphan").unwrap(); + + let result = ctx.generate_manifest_full("folder", None).unwrap(); + assert_eq!(result.items.len(), 1); + assert_eq!(result.items[0].rel_path, "folder/indexed.md"); + assert_eq!(result.unindexed_files, vec!["folder/orphan.md".to_string()]); + } + + #[test] + fn test_generate_manifest_full_detects_nested_unindexed() { + let (ctx, _temp) = create_test_context(); + ctx.create_folder("project", None).unwrap(); + + // Two nested orphans created bypass the API. The nested directory + // also has no `folders` row — scan must still discover them. + let nested = ctx.env_info().contexts_root.join("project/research"); + std::fs::create_dir_all(&nested).unwrap(); + std::fs::write(nested.join("a.md"), "a").unwrap(); + std::fs::write(nested.join("b.md"), "b").unwrap(); + std::fs::write(ctx.env_info().contexts_root.join("project/INDEX.md"), "idx").unwrap(); + + let result = ctx.generate_manifest_full("project", None).unwrap(); + assert!(result.items.is_empty()); + assert_eq!( + result.unindexed_files, + vec![ + "project/INDEX.md".to_string(), + "project/research/a.md".to_string(), + "project/research/b.md".to_string(), + ] + ); + } + + #[test] + fn test_reconcile_folder_registers_orphans() { + let (ctx, _temp) = create_test_context(); + ctx.create_folder("project", None).unwrap(); + + let nested = ctx.env_info().contexts_root.join("project/research"); + std::fs::create_dir_all(&nested).unwrap(); + std::fs::write(nested.join("a.md"), "a").unwrap(); + std::fs::write(ctx.env_info().contexts_root.join("project/INDEX.md"), "idx").unwrap(); + + let added = ctx.reconcile_folder("project").unwrap(); + assert_eq!( + added, + vec![ + "project/INDEX.md".to_string(), + "project/research/a.md".to_string(), + ] + ); + + // After reconcile, manifest no longer reports drift. + let result = ctx.generate_manifest_full("project", None).unwrap(); + assert_eq!(result.items.len(), 2); + assert!(result.unindexed_files.is_empty()); + + // Idempotent — second run finds nothing. + let added2 = ctx.reconcile_folder("project").unwrap(); + assert!(added2.is_empty()); + + // Newly registered docs have stable_ids and resolvable metadata. + let meta = ctx.get_doc_meta("project/INDEX.md").unwrap(); + assert!(!meta.stable_id.is_empty()); + } } diff --git a/crates/opencontext-node/index.d.ts b/crates/opencontext-node/index.d.ts index 5b6b373..eeff878 100644 --- a/crates/opencontext-node/index.d.ts +++ b/crates/opencontext-node/index.d.ts @@ -72,12 +72,17 @@ export declare function getDocMeta(docPath: string): NapiResult export declare function getDocByStableId(stableId: string): NapiResult export declare function saveDocContent(options: SaveDocOptions): NapiResult export declare function generateManifest(options: ManifestOptions): NapiResult +export interface ReconcileOptions { + folderPath: string +} +export declare function reconcileFolder(options: ReconcileOptions): NapiResult /** Search options passed from JavaScript */ export interface SearchOptions { query: string limit?: number mode?: string aggregateBy?: string + docType?: string } /** Load search config */ export declare function loadSearchConfig(): any diff --git a/crates/opencontext-node/index.js b/crates/opencontext-node/index.js index a232ea7..99edf7c 100644 --- a/crates/opencontext-node/index.js +++ b/crates/opencontext-node/index.js @@ -310,7 +310,7 @@ if (!nativeBinding) { throw new Error(`Failed to load native binding`) } -const { initEnvironment, listFolders, createFolder, renameFolder, moveFolder, removeFolder, listDocs, createDoc, moveDoc, renameDoc, removeDoc, setDocDescription, getDocContent, getDocMeta, getDocByStableId, saveDocContent, generateManifest, Searcher, Indexer, loadSearchConfig, startIndexSync, isIndexSyncRunning, getIndexSyncStatus } = nativeBinding +const { initEnvironment, listFolders, createFolder, renameFolder, moveFolder, removeFolder, listDocs, createDoc, moveDoc, renameDoc, removeDoc, setDocDescription, getDocContent, getDocMeta, getDocByStableId, saveDocContent, generateManifest, reconcileFolder, Searcher, Indexer, loadSearchConfig, startIndexSync, isIndexSyncRunning, getIndexSyncStatus } = nativeBinding module.exports.initEnvironment = initEnvironment module.exports.listFolders = listFolders @@ -329,6 +329,7 @@ module.exports.getDocMeta = getDocMeta module.exports.getDocByStableId = getDocByStableId module.exports.saveDocContent = saveDocContent module.exports.generateManifest = generateManifest +module.exports.reconcileFolder = reconcileFolder module.exports.Searcher = Searcher module.exports.Indexer = Indexer module.exports.loadSearchConfig = loadSearchConfig diff --git a/crates/opencontext-node/package-lock.json b/crates/opencontext-node/package-lock.json index af1b1d7..963f16b 100644 --- a/crates/opencontext-node/package-lock.json +++ b/crates/opencontext-node/package-lock.json @@ -17,6 +17,7 @@ "optionalDependencies": { "@aicontextlab/core-native-darwin-arm64": "^0.1.0", "@aicontextlab/core-native-darwin-x64": "^0.1.0", + "@aicontextlab/core-native-linux-x64-gnu": "^0.1.0", "@aicontextlab/core-native-win32-x64-msvc": "^0.1.0" } }, @@ -46,6 +47,9 @@ "darwin" ] }, + "node_modules/@aicontextlab/core-native-linux-x64-gnu": { + "optional": true + }, "node_modules/@aicontextlab/core-native-win32-x64-msvc": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@aicontextlab/core-native-win32-x64-msvc/-/core-native-win32-x64-msvc-0.1.9.tgz", diff --git a/crates/opencontext-node/package.json b/crates/opencontext-node/package.json index 1459e8a..32d186a 100644 --- a/crates/opencontext-node/package.json +++ b/crates/opencontext-node/package.json @@ -11,7 +11,8 @@ "additional": [ "x86_64-apple-darwin", "aarch64-apple-darwin", - "x86_64-pc-windows-msvc" + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" ] } }, @@ -32,7 +33,8 @@ "optionalDependencies": { "@aicontextlab/core-native-darwin-x64": "^0.1.0", "@aicontextlab/core-native-darwin-arm64": "^0.1.0", - "@aicontextlab/core-native-win32-x64-msvc": "^0.1.0" + "@aicontextlab/core-native-win32-x64-msvc": "^0.1.0", + "@aicontextlab/core-native-linux-x64-gnu": "^0.1.0" }, "engines": { "node": ">= 18" diff --git a/crates/opencontext-node/src/lib.rs b/crates/opencontext-node/src/lib.rs index 90a77b1..77f5a41 100644 --- a/crates/opencontext-node/src/lib.rs +++ b/crates/opencontext-node/src/lib.rs @@ -239,11 +239,24 @@ pub fn save_doc_content(env: Env, options: SaveDocOptions) -> NapiResult<JsUnkno #[napi] pub fn generate_manifest(env: Env, options: ManifestOptions) -> NapiResult<JsUnknown> { let ctx = ctx()?; - let manifest = - convert(ctx.generate_manifest(&options.folder_path, options.limit.map(|v| v as usize)))?; + let manifest = convert( + ctx.generate_manifest_full(&options.folder_path, options.limit.map(|v| v as usize)), + )?; to_js(env, &manifest) } +#[napi(object)] +pub struct ReconcileOptions { + pub folder_path: String, +} + +#[napi] +pub fn reconcile_folder(env: Env, options: ReconcileOptions) -> NapiResult<JsUnknown> { + let ctx = ctx()?; + let added = convert(ctx.reconcile_folder(&options.folder_path))?; + to_js(env, &added) +} + fn to_js<T: Serialize>(env: Env, value: &T) -> NapiResult<JsUnknown> { env.to_js_value(value) } diff --git a/docs/images/overview.png b/docs/images/overview.png new file mode 100644 index 0000000..0444d06 Binary files /dev/null and b/docs/images/overview.png differ diff --git a/package-lock.json b/package-lock.json index 7abcb95..cf33d68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-shell": "^2.3.3", "@tiptap/extension-bubble-menu": "^3.14.0", - "@tiptap/extension-code-block-lowlight": "^3.14.0", + "@tiptap/extension-code-block": "^3.18.0", "@tiptap/extension-floating-menu": "^3.14.0", "@tiptap/extension-horizontal-rule": "^3.14.0", "@tiptap/extension-image": "^3.14.0", @@ -57,6 +57,7 @@ "cors": "^2.8.5", "express": "^5.0.1", "fs-extra": "^11.3.2", + "highlight.js": "^11.11.1", "i18next": "^25.7.2", "i18next-browser-languagedetector": "^8.2.0", "lowlight": "^3.3.0", @@ -78,6 +79,8 @@ "remark-toc": "^9.0.0", "tiptap-markdown": "^0.9.0", "vectra": "^0.11.1", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0", "zod": "^4.1.13" }, "bin": { @@ -97,24 +100,77 @@ "node": ">=18" }, "optionalDependencies": { - "@aicontextlab/core-native": "^0.1.0" + "@aicontextlab/core-native": "^0.2.1" } }, "node_modules/@aicontextlab/core-native": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@aicontextlab/core-native/-/core-native-0.1.7.tgz", - "integrity": "sha512-9wfvyH2+haOGf6vKXJ2nUqhNiBbGfwx+OdNOWB6Mu71gjQV/BVRlRLhnFJHxi0GZEtO9L81D3XeGWnnUCMCidg==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aicontextlab/core-native/-/core-native-0.2.1.tgz", + "integrity": "sha512-+HXRAQiR5CsPjYLT6t+1wvkymxXACcA4NwZY5Stl857jFCwpI8l+pmjhVH1KlOQ5yAiaKE5xyiYGSUJTdKLyGA==", "license": "ISC", "optional": true, "engines": { "node": ">= 18" }, "optionalDependencies": { - "@aicontextlab/core-native-darwin-arm64": "0.1.0", - "@aicontextlab/core-native-darwin-x64": "0.1.0", - "@aicontextlab/core-native-win32-x64-msvc": "0.1.0" + "@aicontextlab/core-native-darwin-arm64": "0.2.1", + "@aicontextlab/core-native-darwin-x64": "0.2.1", + "@aicontextlab/core-native-linux-x64-gnu": "0.2.1", + "@aicontextlab/core-native-win32-x64-msvc": "0.2.1" } }, + "node_modules/@aicontextlab/core-native-darwin-arm64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aicontextlab/core-native-darwin-arm64/-/core-native-darwin-arm64-0.2.1.tgz", + "integrity": "sha512-aQnSL4mDDA4sDw9N3ZYU9gpa/MdGTbpNiUV02ZjOEWLDuyKjDrwM9UbFygw/c3CP81mMyDXrd7sHCCuoba4N7g==", + "cpu": [ + "arm64" + ], + "license": "ISC", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@aicontextlab/core-native-darwin-x64": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aicontextlab/core-native-darwin-x64/-/core-native-darwin-x64-0.2.1.tgz", + "integrity": "sha512-BaZBrEH2KEdCy/rJfrV6Rkws8i1blkPxSdnV2vW8Z/3TjKHufQAMd1X1Bx+gvvKLZu5HHYa2a3WNBQkVWk9HfQ==", + "cpu": [ + "x64" + ], + "license": "ISC", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@aicontextlab/core-native-linux-x64-gnu": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aicontextlab/core-native-linux-x64-gnu/-/core-native-linux-x64-gnu-0.2.1.tgz", + "integrity": "sha512-iil6pMlffLX1ytIQs6XTKOGueZVu4TwQ786xOYddyqeHBxOH2DSiJVi/3luoydOW5khNLDymlWldB0lvohx9zQ==", + "cpu": [ + "x64" + ], + "license": "ISC", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@aicontextlab/core-native-win32-x64-msvc": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aicontextlab/core-native-win32-x64-msvc/-/core-native-win32-x64-msvc-0.2.1.tgz", + "integrity": "sha512-U9my6ZwEmm6gwrTWLOA5uZpZESzO8KD6k9k42tJYKE0X/BW72847kXl9qiicu1zKwc5cNA4dTXDA5qmK9ETuJA==", + "cpu": [ + "x64" + ], + "license": "ISC", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -128,13 +184,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -143,9 +199,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", "dev": true, "license": "MIT", "engines": { @@ -153,21 +209,21 @@ } }, "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -183,25 +239,15 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -211,13 +257,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.27.2", + "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -227,16 +273,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -248,29 +284,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { "node": ">=6.9.0" @@ -280,9 +316,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", "engines": { @@ -320,27 +356,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.5" + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -382,42 +418,42 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", "debug": "^4.3.1" }, "engines": { @@ -425,9 +461,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "dev": true, "license": "MIT", "dependencies": { @@ -498,9 +534,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -919,18 +955,18 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.27.16", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", - "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.1.6", - "@floating-ui/utils": "^0.2.10", + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { - "react": ">=17.0.0", - "react-dom": ">=17.0.0" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "node_modules/@floating-ui/react-dom": { @@ -1054,21 +1090,6 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, - "node_modules/@headlessui/react/node_modules/@floating-ui/react": { - "version": "0.26.28", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", - "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", - "license": "MIT", - "dependencies": { - "@floating-ui/react-dom": "^2.1.2", - "@floating-ui/utils": "^0.2.8", - "tabbable": "^6.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/@heroicons/react": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", @@ -1079,13 +1100,13 @@ } }, "node_modules/@heroui/aria-utils": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/aria-utils/-/aria-utils-2.2.24.tgz", - "integrity": "sha512-Y7FfQl2jvJr8JjpH+iuJElDwbn3eSWohuxHg6e5+xk5GcPYrEecgr0F/9qD6VU8IvVrRzJ00JzmT87lgA5iE3Q==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/aria-utils/-/aria-utils-2.2.26.tgz", + "integrity": "sha512-FUrI92sy3s3JnZPBLmGH4UaT6nMrWCr2ksxGdL86eTc9S+QbUtiGgMw4SFMTsvjH175q8Cbl67/276kK0WHpOw==", "license": "MIT", "dependencies": { - "@heroui/system": "2.4.23", - "@react-aria/utils": "3.31.0", + "@heroui/system": "2.4.25", + "@react-aria/utils": "3.32.0", "@react-stately/collections": "3.12.8", "@react-types/overlays": "3.9.2", "@react-types/shared": "3.32.1" @@ -1105,51 +1126,64 @@ } }, "node_modules/@heroui/form": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/@heroui/form/-/form-2.1.27.tgz", - "integrity": "sha512-vtaBqWhxppkJeWgbAZA/A1bRj6XIudBqJWSkoqYlejtLuvaxNwxQ2Z9u7ewxN96R6QqPrQwChlknIn0NgCWlXQ==", + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/@heroui/form/-/form-2.1.29.tgz", + "integrity": "sha512-bWkd9SK+uuZN6gDVy/p9ccrpUryEjW4Y6y1EDaAsXYV8E9o/7JwIoWyZ0oxfskk1CS5TCHpKIYlb7mkdCeYmkA==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12", - "@heroui/system": "2.4.23", - "@heroui/theme": "2.4.23", + "@heroui/system": "2.4.25", + "@heroui/theme": "2.4.25", "@react-stately/form": "3.2.2", "@react-types/form": "3.7.16", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18", "react-dom": ">=18" } }, "node_modules/@heroui/form/node_modules/@heroui/theme": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.23.tgz", - "integrity": "sha512-5hoaRWG+/d/t06p7Pfhz70DUP0Uggjids7/z2Ytgup4A8KAOvDIXxvHUDlk6rRHKiN1wDMNA5H+EWsSXB/m03Q==", + "version": "2.4.25", + "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.25.tgz", + "integrity": "sha512-nTptYhO1V9rMoh9SJDnMfaSmFuoXvbem1UuwgHcraRtqy/TIVBPqv26JEGzSoUCL194TDGOJpqrpMuab/PdXcw==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12", - "clsx": "^1.2.1", "color": "^4.2.3", "color2k": "^2.0.3", "deepmerge": "4.3.1", "flat": "^5.0.2", - "tailwind-merge": "3.3.1", - "tailwind-variants": "3.1.1" + "tailwind-merge": "3.4.0", + "tailwind-variants": "3.2.2" }, "peerDependencies": { "tailwindcss": ">=4.0.0" } }, - "node_modules/@heroui/form/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "node_modules/@heroui/form/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, "engines": { - "node": ">=6" + "node": ">=12.5.0" + } + }, + "node_modules/@heroui/form/node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, "node_modules/@heroui/form/node_modules/tailwindcss": { @@ -1160,12 +1194,12 @@ "peer": true }, "node_modules/@heroui/framer-utils": { - "version": "2.1.23", - "resolved": "https://registry.npmjs.org/@heroui/framer-utils/-/framer-utils-2.1.23.tgz", - "integrity": "sha512-crLLMjRmxs8/fysFv5gwghSGcDmYYkhNfAWh1rFzDy+FRPZN4f/bPH2rt85hdApmuHbWt0QCocqsrjHxLEzrAw==", + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/@heroui/framer-utils/-/framer-utils-2.1.25.tgz", + "integrity": "sha512-uH55w1g0UuzPB9/2XfTFq/JiJG+Vxp4N5hAAw0/G4R/kFo4YYdtPafmYyL1Qcpi37LgbLdLP6w4dQejLmzR0Mg==", "license": "MIT", "dependencies": { - "@heroui/system": "2.4.23", + "@heroui/system": "2.4.25", "@heroui/use-measure": "2.1.8" }, "peerDependencies": { @@ -1175,61 +1209,61 @@ } }, "node_modules/@heroui/react": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/@heroui/react/-/react-2.8.5.tgz", - "integrity": "sha512-cGiG0/DCPsYopa+zACFDmtx9LQDfY5KU58Tt82ELANhmKRyYAesAq9tSa01dG+MjOXUTUR6cxp5i5RmRn8rPYg==", - "license": "MIT", - "dependencies": { - "@heroui/accordion": "2.2.24", - "@heroui/alert": "2.2.27", - "@heroui/autocomplete": "2.3.29", - "@heroui/avatar": "2.2.22", - "@heroui/badge": "2.2.17", - "@heroui/breadcrumbs": "2.2.22", - "@heroui/button": "2.2.27", - "@heroui/calendar": "2.2.27", - "@heroui/card": "2.2.25", - "@heroui/checkbox": "2.3.27", - "@heroui/chip": "2.2.22", - "@heroui/code": "2.2.21", - "@heroui/date-input": "2.3.27", - "@heroui/date-picker": "2.3.28", - "@heroui/divider": "2.2.20", - "@heroui/drawer": "2.2.24", - "@heroui/dropdown": "2.3.27", - "@heroui/form": "2.1.27", - "@heroui/framer-utils": "2.1.23", - "@heroui/image": "2.2.17", - "@heroui/input": "2.4.28", - "@heroui/input-otp": "2.1.27", - "@heroui/kbd": "2.2.22", - "@heroui/link": "2.2.23", - "@heroui/listbox": "2.3.26", - "@heroui/menu": "2.2.26", - "@heroui/modal": "2.2.24", - "@heroui/navbar": "2.2.25", - "@heroui/number-input": "2.0.18", - "@heroui/pagination": "2.2.24", - "@heroui/popover": "2.3.27", - "@heroui/progress": "2.2.22", - "@heroui/radio": "2.3.27", - "@heroui/ripple": "2.2.20", - "@heroui/scroll-shadow": "2.3.18", - "@heroui/select": "2.4.28", - "@heroui/skeleton": "2.2.17", - "@heroui/slider": "2.4.24", - "@heroui/snippet": "2.2.28", - "@heroui/spacer": "2.2.21", - "@heroui/spinner": "2.2.24", - "@heroui/switch": "2.2.24", - "@heroui/system": "2.4.23", - "@heroui/table": "2.2.27", - "@heroui/tabs": "2.2.24", - "@heroui/theme": "2.4.23", - "@heroui/toast": "2.0.17", - "@heroui/tooltip": "2.2.24", - "@heroui/user": "2.2.22", - "@react-aria/visually-hidden": "3.8.28" + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/@heroui/react/-/react-2.8.7.tgz", + "integrity": "sha512-0PkjyvjXQpsjNz9P6q3YmJEWO7F+cyQjc2Ts7HqfvnOWPKAX3zAVnExq8d4Bdwnpp1F6TZpuC0woowVq6Fj4Fw==", + "license": "MIT", + "dependencies": { + "@heroui/accordion": "2.2.26", + "@heroui/alert": "2.2.29", + "@heroui/autocomplete": "2.3.31", + "@heroui/avatar": "2.2.24", + "@heroui/badge": "2.2.18", + "@heroui/breadcrumbs": "2.2.24", + "@heroui/button": "2.2.29", + "@heroui/calendar": "2.2.29", + "@heroui/card": "2.2.27", + "@heroui/checkbox": "2.3.29", + "@heroui/chip": "2.2.24", + "@heroui/code": "2.2.22", + "@heroui/date-input": "2.3.29", + "@heroui/date-picker": "2.3.30", + "@heroui/divider": "2.2.21", + "@heroui/drawer": "2.2.26", + "@heroui/dropdown": "2.3.29", + "@heroui/form": "2.1.29", + "@heroui/framer-utils": "2.1.25", + "@heroui/image": "2.2.18", + "@heroui/input": "2.4.30", + "@heroui/input-otp": "2.1.29", + "@heroui/kbd": "2.2.23", + "@heroui/link": "2.2.25", + "@heroui/listbox": "2.3.28", + "@heroui/menu": "2.2.28", + "@heroui/modal": "2.2.26", + "@heroui/navbar": "2.2.27", + "@heroui/number-input": "2.0.20", + "@heroui/pagination": "2.2.26", + "@heroui/popover": "2.3.29", + "@heroui/progress": "2.2.24", + "@heroui/radio": "2.3.29", + "@heroui/ripple": "2.2.21", + "@heroui/scroll-shadow": "2.3.19", + "@heroui/select": "2.4.30", + "@heroui/skeleton": "2.2.18", + "@heroui/slider": "2.4.26", + "@heroui/snippet": "2.2.30", + "@heroui/spacer": "2.2.22", + "@heroui/spinner": "2.2.26", + "@heroui/switch": "2.2.26", + "@heroui/system": "2.4.25", + "@heroui/table": "2.2.29", + "@heroui/tabs": "2.2.26", + "@heroui/theme": "2.4.25", + "@heroui/toast": "2.0.19", + "@heroui/tooltip": "2.2.26", + "@heroui/user": "2.2.24", + "@react-aria/visually-hidden": "3.8.29" }, "peerDependencies": { "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", @@ -1260,106 +1294,106 @@ } }, "node_modules/@heroui/react/node_modules/@heroui/accordion": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/accordion/-/accordion-2.2.24.tgz", - "integrity": "sha512-iVJVKKsGN4t3hn4Exwic6n5SOQOmmmsodSsCt0VUcs5VTHu9876sAC44xlEMpc9CP8pC1wQS3DzWl3mN6Z120g==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/accordion/-/accordion-2.2.26.tgz", + "integrity": "sha512-hTOyxt8sQqRHDyz6M4g0eRIICwQQy+03zFXPbDv7DQINMyZLwAjIZhtZBjSa3N+nnyJ4YBCxBlQr4zFJChD9aw==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/divider": "2.2.20", + "@heroui/aria-utils": "2.2.26", + "@heroui/divider": "2.2.21", "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-accordion": "2.2.18", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-stately/tree": "3.9.3", + "@heroui/use-aria-accordion": "2.2.19", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-stately/tree": "3.9.4", "@react-types/accordion": "3.0.0-alpha.26", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/alert": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@heroui/alert/-/alert-2.2.27.tgz", - "integrity": "sha512-Y6oX9SV//tdhxhpgkSZvnjwdx7d8S7RAhgVlxCs2Hla//nCFC3yiMHIv8UotTryAGdOwZIsffmcna9vqbNL5vw==", + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/@heroui/alert/-/alert-2.2.29.tgz", + "integrity": "sha512-poPE5fwK4CQO2s3AcLcdVyde4FU8NAJKn8YpUEcoP/Kfn8i8nuHoRKMTj5Ofs/0W/y4ysABajsgKPydPNzUupA==", "license": "MIT", "dependencies": { - "@heroui/button": "2.2.27", + "@heroui/button": "2.2.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@react-stately/utils": "3.10.8" + "@react-stately/utils": "3.11.0" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.19", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/autocomplete": { - "version": "2.3.29", - "resolved": "https://registry.npmjs.org/@heroui/autocomplete/-/autocomplete-2.3.29.tgz", - "integrity": "sha512-BQkiWrrhPbNMFF1Hd60QDyG4iwD+sdsjWh0h7sw2XhcT6Bjw/6Hqpf4eHsTvPElW/554vPZVtChjugRY1N2zsw==", + "version": "2.3.31", + "resolved": "https://registry.npmjs.org/@heroui/autocomplete/-/autocomplete-2.3.31.tgz", + "integrity": "sha512-xRA3mttbLSiSU9rJSm1N3+liHcLEUUCiGdKRkCa89yZwcrD9N1mg6FaTrn099W0/obHZ30r36Nmfx8z3Z7Cnfw==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/button": "2.2.27", - "@heroui/form": "2.1.27", - "@heroui/input": "2.4.28", - "@heroui/listbox": "2.3.26", - "@heroui/popover": "2.3.27", + "@heroui/aria-utils": "2.2.26", + "@heroui/button": "2.2.29", + "@heroui/form": "2.1.29", + "@heroui/input": "2.4.30", + "@heroui/listbox": "2.3.28", + "@heroui/popover": "2.3.29", "@heroui/react-utils": "2.1.14", - "@heroui/scroll-shadow": "2.3.18", + "@heroui/scroll-shadow": "2.3.19", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/combobox": "3.14.0", - "@react-aria/i18n": "3.12.13", - "@react-stately/combobox": "3.12.0", - "@react-types/combobox": "3.13.9", + "@react-aria/combobox": "3.14.1", + "@react-aria/i18n": "3.12.14", + "@react-stately/combobox": "3.12.1", + "@react-types/combobox": "3.13.10", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/avatar": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/avatar/-/avatar-2.2.22.tgz", - "integrity": "sha512-znmKdsrVj91Fg8+wm/HA/b8zi3iAg5g3MezliBfS2PmwgZcpBR6VtwgeeP6uN49+TR+faGIrck0Zxceuw4U0FQ==", + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/@heroui/avatar/-/avatar-2.2.24.tgz", + "integrity": "sha512-GuocEjSrxM6lHlLjrpJam5MJzKzprXtJjVOnXAcOzbWN8VKSUbYvvnf4mMtb3ckfVAE8AwF9vX9S9LwH1kk9/w==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-image": "2.1.13", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6" + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/badge": { - "version": "2.2.17", - "resolved": "https://registry.npmjs.org/@heroui/badge/-/badge-2.2.17.tgz", - "integrity": "sha512-UNILRsAIJn+B6aWml+Rv2QCyYB7sadNqRPDPzNeVKJd8j3MNgZyyEHDwvqM2FWrgGccQIuWFaUgGdnPxRJpwwg==", + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/@heroui/badge/-/badge-2.2.18.tgz", + "integrity": "sha512-OfGove8YJ9oDrdugzq05FC15ZKD5nzqe+thPZ+1SY1LZorJQjZvqSD9QnoEH1nG7fu2IdH6pYJy3sZ/b6Vj5Kg==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", @@ -1367,287 +1401,287 @@ }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/breadcrumbs": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/breadcrumbs/-/breadcrumbs-2.2.22.tgz", - "integrity": "sha512-2fWfpbwhRPeC99Kuzu+DnzOYL4TOkDm9sznvSj0kIAbw/Rvl+D2/6fmBOaTRIUXfswWpHVRUCcNYczIAp0PkoA==", + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/@heroui/breadcrumbs/-/breadcrumbs-2.2.24.tgz", + "integrity": "sha512-O4M+FrqmAyBB0kfUjBN8PyuVfMMuMRg8B6dl7U+DxFyzfc3TmgtI9t2rIrnnNKj/EA3s/FEv9iaPcb02W6Fp5A==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@react-aria/breadcrumbs": "3.5.29", - "@react-aria/focus": "3.21.2", + "@react-aria/breadcrumbs": "3.5.30", + "@react-aria/focus": "3.21.3", "@react-types/breadcrumbs": "3.7.17" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/button": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@heroui/button/-/button-2.2.27.tgz", - "integrity": "sha512-Fxb8rtjPQm9T4GAtB1oW2QMUiQCtn7EtvO5AN41ANxAgmsNMM5wnLTkxQ05vNueCrp47kTDtSuyMhKU2llATHQ==", + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/@heroui/button/-/button-2.2.29.tgz", + "integrity": "sha512-F8cWp6V1/dJIeLOj0Cb9fA8luwzVKI3RUMUmx4zLo0C90cctRzssAMlg6eQ+SBz2NQxCYxMff8mtxMri1wrizg==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", - "@heroui/ripple": "2.2.20", + "@heroui/ripple": "2.2.21", "@heroui/shared-utils": "2.1.12", - "@heroui/spinner": "2.2.24", - "@heroui/use-aria-button": "2.2.20", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", + "@heroui/spinner": "2.2.26", + "@heroui/use-aria-button": "2.2.21", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/calendar": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@heroui/calendar/-/calendar-2.2.27.tgz", - "integrity": "sha512-VtyXQSoT9u9tC4HjBkJIaSSmhau1LwPUwvof0LjYDpBfTsJKqn+308wI3nAp75BTbAkK+vFM8LI0VfbALCwR4Q==", + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/@heroui/calendar/-/calendar-2.2.29.tgz", + "integrity": "sha512-poDlzOIB30sWSG+xxgNUwiSM90JmGHxq8w9ggVW460BChMAxPSA0IXZXF8fXWjReblSKHu50yS+Z2/koFJDl8Q==", "license": "MIT", "dependencies": { - "@heroui/button": "2.2.27", + "@heroui/button": "2.2.29", "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-button": "2.2.20", - "@internationalized/date": "3.10.0", - "@react-aria/calendar": "3.9.2", - "@react-aria/focus": "3.21.2", - "@react-aria/i18n": "3.12.13", - "@react-aria/interactions": "3.25.6", - "@react-aria/visually-hidden": "3.8.28", - "@react-stately/calendar": "3.9.0", - "@react-stately/utils": "3.10.8", + "@heroui/use-aria-button": "2.2.21", + "@internationalized/date": "3.10.1", + "@react-aria/calendar": "3.9.3", + "@react-aria/focus": "3.21.3", + "@react-aria/i18n": "3.12.14", + "@react-aria/interactions": "3.26.0", + "@react-aria/visually-hidden": "3.8.29", + "@react-stately/calendar": "3.9.1", + "@react-stately/utils": "3.11.0", "@react-types/button": "3.14.1", - "@react-types/calendar": "3.8.0", + "@react-types/calendar": "3.8.1", "@react-types/shared": "3.32.1", "scroll-into-view-if-needed": "3.0.10" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/card": { - "version": "2.2.25", - "resolved": "https://registry.npmjs.org/@heroui/card/-/card-2.2.25.tgz", - "integrity": "sha512-dtd/G24zePIHPutRIxWC69IO3IGJs8X+zh9rBYM9cY5Q972D8Eet5WdWTfDBhw//fFIoagDAs5YcI9emGczGaQ==", + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/@heroui/card/-/card-2.2.27.tgz", + "integrity": "sha512-UP9IuKYzGCjwBaocv8eiusOi1SheV6Pn37r05N6Hrqd8DKvs2Ebgye3hGRZ3z3MKRsqFKAyhG+3tdDIjVs3J/Q==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", - "@heroui/ripple": "2.2.20", + "@heroui/ripple": "2.2.21", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-button": "2.2.20", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", + "@heroui/use-aria-button": "2.2.21", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/checkbox": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/@heroui/checkbox/-/checkbox-2.3.27.tgz", - "integrity": "sha512-YC0deiB7EOzcpJtk9SdySugD1Z2TNtfyYee2voDBHrng7ZBRB+cmAvizXINHnaQGFi0yuVPrZ5ixR/wsvTNW+Q==", + "version": "2.3.29", + "resolved": "https://registry.npmjs.org/@heroui/checkbox/-/checkbox-2.3.29.tgz", + "integrity": "sha512-KcI2hAv/lsW427KEtcIq5GFILmRNiPaj9em5QaDrGUYQeJkO29slOGG8M8YAWvF4e3rRzBa9Xfzjp1D51d/OGA==", "license": "MIT", "dependencies": { - "@heroui/form": "2.1.27", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-callback-ref": "2.1.8", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/checkbox": "3.16.2", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-stately/checkbox": "3.7.2", - "@react-stately/toggle": "3.9.2", + "@react-aria/checkbox": "3.16.3", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-stately/checkbox": "3.7.3", + "@react-stately/toggle": "3.9.3", "@react-types/checkbox": "3.10.2", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/chip": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/chip/-/chip-2.2.22.tgz", - "integrity": "sha512-6O4Sv1chP+xxftp7E5gHUJIzo04ML9BW9N9jjxWCqT0Qtl+a/ZxnDalCyup6oraMiVLLHp+zEVX93C+3LONgkg==", + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/@heroui/chip/-/chip-2.2.24.tgz", + "integrity": "sha512-QdJPQroHKGO+ZgZVlnhlhnAwE46Sm23UlHuFiW6cFIRVuARxHo/K+M/KXpjUEAP659EOtMyS1CzIVhDzuqHuSg==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6" + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/code": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/@heroui/code/-/code-2.2.21.tgz", - "integrity": "sha512-ExHcfTGr9tCbAaBOfMzTla8iHHfwIV5/xRk4WApeVmL4MiIlLMykc9bSi1c88ltaJInQGFAmE6MOFHXuGHxBXw==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/@heroui/code/-/code-2.2.22.tgz", + "integrity": "sha512-i3pDe5Mzzh04jVx0gFwi2NMtCmsYfIRhLvkebXQcmfUDYl0+IGRJLcBsrWoOzes0pE/s7yyv+yJ/VhoU8F5jcg==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/system-rsc": "2.3.20" + "@heroui/system-rsc": "2.3.21" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/date-input": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/@heroui/date-input/-/date-input-2.3.27.tgz", - "integrity": "sha512-IxvZYezbR9jRxTWdsuHH47nsnB6RV1HPY7VwiJd9ZCy6P6oUV0Rx3cdwIRtUnyXbvz1G7+I22NL4C2Ku194l8A==", + "version": "2.3.29", + "resolved": "https://registry.npmjs.org/@heroui/date-input/-/date-input-2.3.29.tgz", + "integrity": "sha512-ADjmqCJWERjd0BYIwCNgA16IJQ+k7K+Y//ht0OKx4wWU2hMrug0MD9nhymecuCuP7Fa6xIU55+ucZ1qSmesNmg==", "license": "MIT", "dependencies": { - "@heroui/form": "2.1.27", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@internationalized/date": "3.10.0", - "@react-aria/datepicker": "3.15.2", - "@react-aria/i18n": "3.12.13", - "@react-stately/datepicker": "3.15.2", - "@react-types/datepicker": "3.13.2", + "@internationalized/date": "3.10.1", + "@react-aria/datepicker": "3.15.3", + "@react-aria/i18n": "3.12.14", + "@react-stately/datepicker": "3.15.3", + "@react-types/datepicker": "3.13.3", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/date-picker": { - "version": "2.3.28", - "resolved": "https://registry.npmjs.org/@heroui/date-picker/-/date-picker-2.3.28.tgz", - "integrity": "sha512-duKvXijabpafxU04sItrozf982tXkUDymcT3SoEvW4LDg6bECgPI8bYNN49hlzkI8+zuwJdKzJ4hDmANGVaL8Q==", + "version": "2.3.30", + "resolved": "https://registry.npmjs.org/@heroui/date-picker/-/date-picker-2.3.30.tgz", + "integrity": "sha512-NBdo1KkaCkFLRMTrzQoAB02qUP/FxEVffFgCUeTwAxQCKb76gnGYfOVKIbxZHleBmQtpaaIl7LlLpjo08qtgFA==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/button": "2.2.27", - "@heroui/calendar": "2.2.27", - "@heroui/date-input": "2.3.27", - "@heroui/form": "2.1.27", - "@heroui/popover": "2.3.27", + "@heroui/aria-utils": "2.2.26", + "@heroui/button": "2.2.29", + "@heroui/calendar": "2.2.29", + "@heroui/date-input": "2.3.29", + "@heroui/form": "2.1.29", + "@heroui/popover": "2.3.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@internationalized/date": "3.10.0", - "@react-aria/datepicker": "3.15.2", - "@react-aria/i18n": "3.12.13", - "@react-stately/datepicker": "3.15.2", - "@react-stately/utils": "3.10.8", - "@react-types/datepicker": "3.13.2", + "@internationalized/date": "3.10.1", + "@react-aria/datepicker": "3.15.3", + "@react-aria/i18n": "3.12.14", + "@react-stately/datepicker": "3.15.3", + "@react-stately/utils": "3.11.0", + "@react-types/datepicker": "3.13.3", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/divider": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/@heroui/divider/-/divider-2.2.20.tgz", - "integrity": "sha512-t+NNJ2e5okZraLKQoj+rS2l49IMy5AeXTixjsR+QRZ/WPrETNpMj4lw5cBSxG0i7WhRhlBa+KgqweUUezvCdAg==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/@heroui/divider/-/divider-2.2.21.tgz", + "integrity": "sha512-aVvl8/3fWUc+/fHbg+hD/0wrkoMKmXG0yRgyNrJSeu0pkRwhb0eD4ZjnBK1pCYqnstoltNE33J8ko/sU+WlmPw==", "license": "MIT", "dependencies": { "@heroui/react-rsc-utils": "2.1.9", - "@heroui/system-rsc": "2.3.20", + "@heroui/system-rsc": "2.3.21", "@react-types/shared": "3.32.1" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/drawer": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/drawer/-/drawer-2.2.24.tgz", - "integrity": "sha512-gb51Lj9A8jlL1UvUrQ+MLS9tz+Qw+cdXwIJd39RXDkJwDmxqhzkz+WoOPZZwcOAHtATmwlTuxxlv6Cro59iswg==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/drawer/-/drawer-2.2.26.tgz", + "integrity": "sha512-XTWKsmYX7/35kOJkidSuuDEbgZqQPv7iJhDvfgVgM1NXX0913CA+Q/Lnl2D7LHFIXs/lhXaV2Z/KWNlbUnBHfQ==", "license": "MIT", "dependencies": { - "@heroui/framer-utils": "2.1.23", - "@heroui/modal": "2.2.24", + "@heroui/framer-utils": "2.1.25", + "@heroui/modal": "2.2.26", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/dropdown": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/@heroui/dropdown/-/dropdown-2.3.27.tgz", - "integrity": "sha512-6aedMmxC+St5Ixz9o3s0ERkLOR6ZQE2uRccmRchPCEt7ZJU6TAeJo7fSpxIvdEUjFDe+pNhR2ojIocZEXtBZZg==", + "version": "2.3.29", + "resolved": "https://registry.npmjs.org/@heroui/dropdown/-/dropdown-2.3.29.tgz", + "integrity": "sha512-QJxA9SgzThrP8mQJQwrlS+PBITn9ig/pXylVgodZbAMbHJ3E/OgTFeAbYTmoxYAlzSLs/0+SfTdm0vI83zrcmA==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/menu": "2.2.26", - "@heroui/popover": "2.3.27", + "@heroui/aria-utils": "2.2.26", + "@heroui/menu": "2.2.28", + "@heroui/popover": "2.3.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@react-aria/focus": "3.21.2", - "@react-aria/menu": "3.19.3", - "@react-stately/menu": "3.9.8", + "@react-aria/focus": "3.21.3", + "@react-aria/menu": "3.19.4", + "@react-stately/menu": "3.9.9", "@react-types/menu": "3.10.5" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/image": { - "version": "2.2.17", - "resolved": "https://registry.npmjs.org/@heroui/image/-/image-2.2.17.tgz", - "integrity": "sha512-B/MrWafTsiCBFnRc0hPTLDBh7APjb/lRuQf18umuh20/1n6KiQXJ7XGSjnrHaA6HQcrtMGh6mDFZDaXq9rHuoA==", + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/@heroui/image/-/image-2.2.18.tgz", + "integrity": "sha512-hrvj/hDM0+Khb9EqstZOPeO0vIGZvhrJWPMxk7a6i2PqhWWQI+ws+nrwsG5XqAkwE4mqqf9Uw8EMfIG1XE5YYg==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", @@ -1656,331 +1690,331 @@ }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/input": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@heroui/input/-/input-2.4.28.tgz", - "integrity": "sha512-uaBubg814YOlVvX13yCAMqsR9HC4jg+asQdukbOvOnFtHY/d53her1BDdXhR9tMcrRTdYWQ3FoHqWbpvd5X4OQ==", + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@heroui/input/-/input-2.4.30.tgz", + "integrity": "sha512-dTtQaZ21PofBIyWCnbysw2zpb5V8g6xu4mrZWO5faXt/bUjQLqmv3Y4MI1ghkWL6d0DB2xx0Z0I+U7LYMvoD4g==", "license": "MIT", "dependencies": { - "@heroui/form": "2.1.27", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/textfield": "3.18.2", - "@react-stately/utils": "3.10.8", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/textfield": "3.18.3", + "@react-stately/utils": "3.11.0", "@react-types/shared": "3.32.1", "@react-types/textfield": "3.12.6", "react-textarea-autosize": "^8.5.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.19", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/input-otp": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/@heroui/input-otp/-/input-otp-2.1.27.tgz", - "integrity": "sha512-VUzQ1u6/0okE0eqDx/2I/8zpGItSsn7Zml01IVwGM4wY2iJeQA+uRjfP+B1ff9jO/y8n582YU4uv/ZSOmmEQ7A==", + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/@heroui/input-otp/-/input-otp-2.1.29.tgz", + "integrity": "sha512-N3vejZl7+4VYazUS0/JZYBTGjUvstYBz9Bo4ArYye7zC20XkM84j3+Ox664UyNTdLu3Fcr7cO0dv4MVo2vJu7Q==", "license": "MIT", "dependencies": { - "@heroui/form": "2.1.27", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-form-reset": "2.0.1", - "@react-aria/focus": "3.21.2", - "@react-aria/form": "3.1.2", + "@react-aria/focus": "3.21.3", + "@react-aria/form": "3.1.3", "@react-stately/form": "3.2.2", - "@react-stately/utils": "3.10.8", + "@react-stately/utils": "3.11.0", "@react-types/textfield": "3.12.6", "input-otp": "1.4.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18", "react-dom": ">=18" } }, "node_modules/@heroui/react/node_modules/@heroui/kbd": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/kbd/-/kbd-2.2.22.tgz", - "integrity": "sha512-PKhgwGB7i53kBuqB1YdFZsg7H9fJ8YESMRRPwRRyPSz5feMdwGidyXs+/ix7lrlYp4mlC3wtPp7L79SEyPCpBA==", + "version": "2.2.23", + "resolved": "https://registry.npmjs.org/@heroui/kbd/-/kbd-2.2.23.tgz", + "integrity": "sha512-nKL1Kl044l1Xsk4U8Nib3wFD2NlZCZo6kdqiqUv+DchOo4s3BJcxWSWqHn6fDVmHNyj3DFMYDvA2f/geMasaHQ==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/system-rsc": "2.3.20" + "@heroui/system-rsc": "2.3.21" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/link": { - "version": "2.2.23", - "resolved": "https://registry.npmjs.org/@heroui/link/-/link-2.2.23.tgz", - "integrity": "sha512-lObtPRLy8ModlTvJiKhczuAV/CIt31hde6xPGFYRpPsaQN1b7RgQMmai5/Iv/M8WrzFmFZRpgW75RKYIB6hHVQ==", + "version": "2.2.25", + "resolved": "https://registry.npmjs.org/@heroui/link/-/link-2.2.25.tgz", + "integrity": "sha512-6hJpMrmHzmVkhze3523xe9PygCjiOHIu0t9p2LRG/kyWrTGx6LZRiufyIHEwZPVm2xp1Wu39UqPwBIkHoGkrag==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-link": "2.2.21", - "@react-aria/focus": "3.21.2", + "@heroui/use-aria-link": "2.2.22", + "@react-aria/focus": "3.21.3", "@react-types/link": "3.6.5" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/listbox": { - "version": "2.3.26", - "resolved": "https://registry.npmjs.org/@heroui/listbox/-/listbox-2.3.26.tgz", - "integrity": "sha512-/k3k+xyl2d+aFfT02h+/0njhsDX8vJDEkPK+dl9ETYI9Oz3L+xbHN9yIzuWjBXYkNGlQCjQ46N+0jWjhP5B4pA==", + "version": "2.3.28", + "resolved": "https://registry.npmjs.org/@heroui/listbox/-/listbox-2.3.28.tgz", + "integrity": "sha512-uONT4NOSYYSOYDtjuMvK13vUYNXspZw+1QpvVSd+Vaq0WcPvEfgoLI/3Kwu4lHPyfoOlE58vCpY7Hfqx/FTQjg==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/divider": "2.2.20", + "@heroui/aria-utils": "2.2.26", + "@heroui/divider": "2.2.21", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-is-mobile": "2.2.12", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/listbox": "3.15.0", - "@react-stately/list": "3.13.1", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/listbox": "3.15.1", + "@react-stately/list": "3.13.2", "@react-types/shared": "3.32.1", "@tanstack/react-virtual": "3.11.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/menu": { - "version": "2.2.26", - "resolved": "https://registry.npmjs.org/@heroui/menu/-/menu-2.2.26.tgz", - "integrity": "sha512-raR5pXgEqizKD9GsWS1yKqTm4RPWMrSQlqXLE2zNMQk0TkDqmPVw1z5griMqu2Zt9Vf2Ectf55vh4c0DNOUGlg==", + "version": "2.2.28", + "resolved": "https://registry.npmjs.org/@heroui/menu/-/menu-2.2.28.tgz", + "integrity": "sha512-54RdjC9cJsdksozy8ZZSoeixFDzbrdCU8qKttg1KYttAUaZzYm853VBwCLYsooIioeCXgrITqNy/NFjQcqx6Fg==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/divider": "2.2.20", + "@heroui/aria-utils": "2.2.26", + "@heroui/divider": "2.2.21", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-is-mobile": "2.2.12", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/menu": "3.19.3", - "@react-stately/tree": "3.9.3", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/menu": "3.19.4", + "@react-stately/tree": "3.9.4", "@react-types/menu": "3.10.5", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/modal": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/modal/-/modal-2.2.24.tgz", - "integrity": "sha512-ISbgorNqgps9iUvQdgANxprdN+6H3Sx9TrGKpuW798qjc2f0T4rTbjrEfFPT8tFx6XYF4P5j7T7m3zoKcortHQ==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/modal/-/modal-2.2.26.tgz", + "integrity": "sha512-NpnjTEweNExUb3pZWr17u15N1OHbBac4QY4aObwcbIJZKsInLU8NbuLbwyRw9nwAshGSf2FdnQ6dhmDZqwNqfA==", "license": "MIT", "dependencies": { "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-button": "2.2.20", - "@heroui/use-aria-modal-overlay": "2.2.19", - "@heroui/use-disclosure": "2.2.17", - "@heroui/use-draggable": "2.1.18", + "@heroui/use-aria-button": "2.2.21", + "@heroui/use-aria-modal-overlay": "2.2.20", + "@heroui/use-disclosure": "2.2.18", + "@heroui/use-draggable": "2.1.19", "@heroui/use-viewport-size": "2.0.1", - "@react-aria/dialog": "3.5.31", - "@react-aria/focus": "3.21.2", - "@react-aria/overlays": "3.30.0", - "@react-stately/overlays": "3.6.20" + "@react-aria/dialog": "3.5.32", + "@react-aria/focus": "3.21.3", + "@react-aria/overlays": "3.31.0", + "@react-stately/overlays": "3.6.21" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/navbar": { - "version": "2.2.25", - "resolved": "https://registry.npmjs.org/@heroui/navbar/-/navbar-2.2.25.tgz", - "integrity": "sha512-5fNIMDpX2htDTMb/Xgv81qw/FuNWb+0Wpfc6rkFtNYd968I7G6Kjm782QB8WQjZ8DsMugcLEYUN4lpbJHRSdwg==", + "version": "2.2.27", + "resolved": "https://registry.npmjs.org/@heroui/navbar/-/navbar-2.2.27.tgz", + "integrity": "sha512-O2G7kavGDuGbPtpzGMci7YmV8Kf7BOxQ6k7xqnwxWivWX2MdvDNyR+ca60FPPdQL14zH+KfrQmQpoPxgxr79pw==", "license": "MIT", "dependencies": { "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-resize": "2.1.8", "@heroui/use-scroll-position": "2.1.8", - "@react-aria/button": "3.14.2", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/overlays": "3.30.0", - "@react-stately/toggle": "3.9.2", - "@react-stately/utils": "3.10.8" + "@react-aria/button": "3.14.3", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/overlays": "3.31.0", + "@react-stately/toggle": "3.9.3", + "@react-stately/utils": "3.11.0" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/number-input": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@heroui/number-input/-/number-input-2.0.18.tgz", - "integrity": "sha512-28v0/0FABs+yy3CcJimcr5uNlhaJSyKt1ENMSXfzPxdN2WgIs14+6NLMT+KV7ibcJl7kmqG0uc8vuIDLVrM5bQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@heroui/number-input/-/number-input-2.0.20.tgz", + "integrity": "sha512-WnSleY9eBRPhZIz4qVi1pYSkxMqNXEZLQgZaiMVbKdkeR9M2ASMo0Qv8+tLMT3KwRaxAu53BvQjp/hz8VADx1Q==", "license": "MIT", "dependencies": { - "@heroui/button": "2.2.27", - "@heroui/form": "2.1.27", + "@heroui/button": "2.2.29", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/focus": "3.21.2", - "@react-aria/i18n": "3.12.13", - "@react-aria/interactions": "3.25.6", - "@react-aria/numberfield": "3.12.2", - "@react-stately/numberfield": "3.10.2", + "@react-aria/focus": "3.21.3", + "@react-aria/i18n": "3.12.14", + "@react-aria/interactions": "3.26.0", + "@react-aria/numberfield": "3.12.3", + "@react-stately/numberfield": "3.10.3", "@react-types/button": "3.14.1", - "@react-types/numberfield": "3.8.15", + "@react-types/numberfield": "3.8.16", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.19", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/pagination": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/pagination/-/pagination-2.2.24.tgz", - "integrity": "sha512-5ObSJ1PzB9D1CjHV0MfDNzLR69vSYpx/rNQLBo/D4g5puaAR7kkGgw5ncf5eirhdKuy9y8VGAhjwhBxO4NUdpQ==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/pagination/-/pagination-2.2.26.tgz", + "integrity": "sha512-Ta70RAMo223BDFw3fAvYew1PauQ+b38Xa0zWnj5mkkrYrLXk7sjomunNtlUFPKkr0B8Dpuu67tp9a8AlmI1z8A==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", "@heroui/use-intersection-observer": "2.2.14", - "@heroui/use-pagination": "2.2.18", - "@react-aria/focus": "3.21.2", - "@react-aria/i18n": "3.12.13", - "@react-aria/interactions": "3.25.6", - "@react-aria/utils": "3.31.0", + "@heroui/use-pagination": "2.2.19", + "@react-aria/focus": "3.21.3", + "@react-aria/i18n": "3.12.14", + "@react-aria/interactions": "3.26.0", + "@react-aria/utils": "3.32.0", "scroll-into-view-if-needed": "3.0.10" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/popover": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/@heroui/popover/-/popover-2.3.27.tgz", - "integrity": "sha512-PmSCKQcAvKIegK59Flr9cglbsEu7OAegQMtwNIjqWHsPT18NNphimmUSJrtuD78rcfKekrZ+Uo9qJEUf0zGZDw==", + "version": "2.3.29", + "resolved": "https://registry.npmjs.org/@heroui/popover/-/popover-2.3.29.tgz", + "integrity": "sha512-ldEV2iJ8dHUxvEGSlARdqU7V/9Nr6X+AJmImEUHXASiDKnJ2GdiMyIuyx4eIC2cbldJ94W2dRUlJ1rt8Pvsm4w==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/button": "2.2.27", + "@heroui/aria-utils": "2.2.26", + "@heroui/button": "2.2.29", "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-button": "2.2.20", - "@heroui/use-aria-overlay": "2.0.4", + "@heroui/use-aria-button": "2.2.21", + "@heroui/use-aria-overlay": "2.0.5", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/dialog": "3.5.31", - "@react-aria/focus": "3.21.2", - "@react-aria/overlays": "3.30.0", - "@react-stately/overlays": "3.6.20", + "@react-aria/dialog": "3.5.32", + "@react-aria/focus": "3.21.3", + "@react-aria/overlays": "3.31.0", + "@react-stately/overlays": "3.6.21", "@react-types/overlays": "3.9.2" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/progress": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/progress/-/progress-2.2.22.tgz", - "integrity": "sha512-ch+iWEDo8d+Owz81vu4+Kj6CLfxi0nUlivQBhXeOzgU3VZbRmxJyW8S6l7wk6GyKJZxsCbYbjV1wPSjZhKJXCg==", + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/@heroui/progress/-/progress-2.2.24.tgz", + "integrity": "sha512-1wGF1tSBx35//7+15dw06j1AB7+FhJiGYIH8hBefDSRD0U16htwXVxoVBk6v4Vd/yfpvVQTktA5fiT+Sl4XQlQ==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-is-mounted": "2.1.8", - "@react-aria/progress": "3.4.27", + "@react-aria/progress": "3.4.28", "@react-types/progress": "3.5.16" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/radio": { - "version": "2.3.27", - "resolved": "https://registry.npmjs.org/@heroui/radio/-/radio-2.3.27.tgz", - "integrity": "sha512-kfDxzPR0u4++lZX2Gf6wbEe/hGbFnoXI4XLbe4e+ZDjGdBSakNuJlcDvWHVoDFZH1xXyOO9w/dHfZuE6O2VGLA==", + "version": "2.3.29", + "resolved": "https://registry.npmjs.org/@heroui/radio/-/radio-2.3.29.tgz", + "integrity": "sha512-0nj6ws7R1yX5yh4plEjvRLbri6vRG6ogWDU9tJIb6D3vqxv7Lmpdna3+V+fdGdz4uvQp3YQebOY+UE3fCak/Ow==", "license": "MIT", "dependencies": { - "@heroui/form": "2.1.27", + "@heroui/form": "2.1.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/radio": "3.12.2", - "@react-aria/visually-hidden": "3.8.28", - "@react-stately/radio": "3.11.2", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/radio": "3.12.3", + "@react-aria/visually-hidden": "3.8.29", + "@react-stately/radio": "3.11.3", "@react-types/radio": "3.9.2", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/ripple": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/@heroui/ripple/-/ripple-2.2.20.tgz", - "integrity": "sha512-3+fBx5jO7l8SE84ZG0vB5BOxKKr23Ay180AeIWcf8m8lhXXd4iShVz2S+keW9PewqVHv52YBaxLoSVQ93Ddcxw==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/@heroui/ripple/-/ripple-2.2.21.tgz", + "integrity": "sha512-wairSq9LnhbIqTCJmUlJAQURQ1wcRK/L8pjg2s3R/XnvZlPXHy4ZzfphiwIlTI21z/f6tH3arxv/g1uXd1RY0g==", "license": "MIT", "dependencies": { "@heroui/dom-animation": "2.1.10", @@ -1988,16 +2022,16 @@ }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/scroll-shadow": { - "version": "2.3.18", - "resolved": "https://registry.npmjs.org/@heroui/scroll-shadow/-/scroll-shadow-2.3.18.tgz", - "integrity": "sha512-P/nLQbFPOlbTLRjO2tKoZCljJtU7iq81wsp7C8wZ1rZI1RmkTx3UgLLeoFWgmAp3ZlUIYgaewTnejt6eRx+28w==", + "version": "2.3.19", + "resolved": "https://registry.npmjs.org/@heroui/scroll-shadow/-/scroll-shadow-2.3.19.tgz", + "integrity": "sha512-y5mdBlhiITVrFnQTDqEphYj7p5pHqoFSFtVuRRvl9wUec2lMxEpD85uMGsfL8OgQTKIAqGh2s6M360+VJm7ajQ==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", @@ -2006,189 +2040,187 @@ }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/select": { - "version": "2.4.28", - "resolved": "https://registry.npmjs.org/@heroui/select/-/select-2.4.28.tgz", - "integrity": "sha512-Dg3jv248Tu+g2WJMWseDjWA0FAG356elZIcE0OufVAIzQoWjLhgbkTqY9ths0HkcHy0nDwQWvyrrwkbif1kNqA==", + "version": "2.4.30", + "resolved": "https://registry.npmjs.org/@heroui/select/-/select-2.4.30.tgz", + "integrity": "sha512-laGM9ib4E/wxWu0T5/85yQZaKaT9HYP2hqy+xpD0HrKOZxBEINyTIbPJCq3cB9LiM6qqJJk/2A3rRjKNSj1Law==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", - "@heroui/form": "2.1.27", - "@heroui/listbox": "2.3.26", - "@heroui/popover": "2.3.27", + "@heroui/aria-utils": "2.2.26", + "@heroui/form": "2.1.29", + "@heroui/listbox": "2.3.28", + "@heroui/popover": "2.3.29", "@heroui/react-utils": "2.1.14", - "@heroui/scroll-shadow": "2.3.18", + "@heroui/scroll-shadow": "2.3.19", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/spinner": "2.2.24", - "@heroui/use-aria-button": "2.2.20", - "@heroui/use-aria-multiselect": "2.4.19", + "@heroui/spinner": "2.2.26", + "@heroui/use-aria-button": "2.2.21", + "@heroui/use-aria-multiselect": "2.4.20", "@heroui/use-form-reset": "2.0.1", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/focus": "3.21.2", - "@react-aria/form": "3.1.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/overlays": "3.30.0", - "@react-aria/visually-hidden": "3.8.28", + "@react-aria/focus": "3.21.3", + "@react-aria/form": "3.1.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/overlays": "3.31.0", + "@react-aria/visually-hidden": "3.8.29", "@react-types/shared": "3.32.1" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/skeleton": { - "version": "2.2.17", - "resolved": "https://registry.npmjs.org/@heroui/skeleton/-/skeleton-2.2.17.tgz", - "integrity": "sha512-WDzwODs+jW+GgMr3oOdLtXXfv8ScXuuWgxN2iPWWyDBcQYXX2XCKGVjCpM5lSKf1UG4Yp3iXuqKzH1m+E+m7kg==", + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/@heroui/skeleton/-/skeleton-2.2.18.tgz", + "integrity": "sha512-7AjU5kjk9rqrKP9mWQiAVj0dow4/vbK5/ejh4jqdb3DZm7bM2+DGzfnQPiS0c2eWR606CgOuuoImpwDS82HJtA==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/slider": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/@heroui/slider/-/slider-2.4.24.tgz", - "integrity": "sha512-GKdqFTCe9O8tT3HEZ/W4TEWkz7ADtUBzuOBXw779Oqqf02HNg9vSnISlNvI6G0ymYjY42EanwA+dChHbPBIVJw==", + "version": "2.4.26", + "resolved": "https://registry.npmjs.org/@heroui/slider/-/slider-2.4.26.tgz", + "integrity": "sha512-hsJOyNjixw8QK5DC9yMWSOg9abbRuXRXao0ZxQH+/xM8F59eb5xZaqopbN7aFmBP7G28Tfge4i36vE8TsK2Q/g==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/tooltip": "2.2.24", - "@react-aria/focus": "3.21.2", - "@react-aria/i18n": "3.12.13", - "@react-aria/interactions": "3.25.6", - "@react-aria/slider": "3.8.2", - "@react-aria/visually-hidden": "3.8.28", - "@react-stately/slider": "3.7.2" + "@heroui/tooltip": "2.2.26", + "@react-aria/focus": "3.21.3", + "@react-aria/i18n": "3.12.14", + "@react-aria/interactions": "3.26.0", + "@react-aria/slider": "3.8.3", + "@react-aria/visually-hidden": "3.8.29", + "@react-stately/slider": "3.7.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.19", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/snippet": { - "version": "2.2.28", - "resolved": "https://registry.npmjs.org/@heroui/snippet/-/snippet-2.2.28.tgz", - "integrity": "sha512-UfC/ZcYpmOutAcazxkizJWlhvqzr077szDyQ85thyUC5yhuRRLrsOHDIhyLWQrEKIcWw5+CaEGS2VLwAFlgfzw==", + "version": "2.2.30", + "resolved": "https://registry.npmjs.org/@heroui/snippet/-/snippet-2.2.30.tgz", + "integrity": "sha512-o/fNVh4jtYAH8/2F6uU7pFdJiCCWZYN0LaPC57dRo8FNxL6+kcxt13Lp+sCBVKEDnuBmMtlL1prjMedX7VqzfQ==", "license": "MIT", "dependencies": { - "@heroui/button": "2.2.27", + "@heroui/button": "2.2.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/tooltip": "2.2.24", + "@heroui/tooltip": "2.2.26", "@heroui/use-clipboard": "2.1.9", - "@react-aria/focus": "3.21.2" + "@react-aria/focus": "3.21.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/spacer": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/@heroui/spacer/-/spacer-2.2.21.tgz", - "integrity": "sha512-WKD+BlgHfqJ8lrkkg/6cvzSWNsbRjzr24HpZnv6cDeWX95wVLTOco9HVR8ohwStMqwu5zYeUd1bw6yCDVTo53w==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/@heroui/spacer/-/spacer-2.2.22.tgz", + "integrity": "sha512-BJ7RauvSY3gx10ntqZkCcyTy9K2FS4AeeryQUE9RgkMKQxP4t5TbeYLPEyomjWK+cCL/ERQCCruW16D3vKyWmw==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/system-rsc": "2.3.20" + "@heroui/system-rsc": "2.3.21" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/spinner": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/spinner/-/spinner-2.2.24.tgz", - "integrity": "sha512-HfKkFffrIN9UdJY2UaenlB8xEwIzolCCFCwU0j3wVnLMX+Dw+ixwaELdAxX14Z6gPQYec6AROKetkWWit14rlw==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/spinner/-/spinner-2.2.26.tgz", + "integrity": "sha512-AtZhUO+IrZwahdQ5FOVptOZRMz7Z51gDUuj1K3pEJvOiKW+zvqab9BHYW9A09nd7qMH+DMM/41PQJbZg+eOHzg==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12", - "@heroui/system": "2.4.23", - "@heroui/system-rsc": "2.3.20" + "@heroui/system": "2.4.25", + "@heroui/system-rsc": "2.3.21" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/switch": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/switch/-/switch-2.2.24.tgz", - "integrity": "sha512-RbV+MECncBKsthX3D8r+CGoQRu8Q3AAYUEdm/7ody6+bMZFmBilm695yLiqziMI33Ct/WQ0WkpvrTClIcmxU/A==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/switch/-/switch-2.2.26.tgz", + "integrity": "sha512-c/FCzromB+ww8AObgA0H//jOrhxyn0MllWVeEwMXac7O6z/N4B+fJ8dLCu/vu1zchySFLuDq/PaETEMJ7hKW4A==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/switch": "3.7.8", - "@react-aria/visually-hidden": "3.8.28", - "@react-stately/toggle": "3.9.2" + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/switch": "3.7.9", + "@react-aria/visually-hidden": "3.8.29", + "@react-stately/toggle": "3.9.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/system-rsc": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/@heroui/system-rsc/-/system-rsc-2.3.20.tgz", - "integrity": "sha512-uZwQErEud/lAX7KRXEdsDcGLyygBffHcgnbCDrLvmTf3cyBE84YziG7AjM7Ts8ZcrF+wBXX4+a1IqnKGlsGEdQ==", + "version": "2.3.21", + "resolved": "https://registry.npmjs.org/@heroui/system-rsc/-/system-rsc-2.3.21.tgz", + "integrity": "sha512-icB7njbNgkI3dcfZhY5LP7VFspaVgWL1lcg9Q7uJMAaj6gGFqqSSnHkSMwpR9AGLxVRKTHey0TUx8CeZDe8XDw==", "license": "MIT", "dependencies": { - "@react-types/shared": "3.32.1", - "clsx": "^1.2.1" + "@react-types/shared": "3.32.1" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/table": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@heroui/table/-/table-2.2.27.tgz", - "integrity": "sha512-XFmbEgBzf89WH1VzmnwENxVzK4JrHV5jdlzyM3snNhk8uDSjfecnUY33qR62cpdZsKiCFFcYf7kQPkCnJGnD0Q==", + "version": "2.2.29", + "resolved": "https://registry.npmjs.org/@heroui/table/-/table-2.2.29.tgz", + "integrity": "sha512-/YLP1+cSSiolj1kvU6YSge4BNvwqT7yDom8YebBHCjidwOBbORGHh6HJ9btVk2GUzdTh57N9vErh9VCEuz5/DA==", "license": "MIT", "dependencies": { - "@heroui/checkbox": "2.3.27", + "@heroui/checkbox": "2.3.29", "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/spacer": "2.2.21", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/table": "3.17.8", - "@react-aria/visually-hidden": "3.8.28", - "@react-stately/table": "3.15.1", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/table": "3.17.9", + "@react-aria/visually-hidden": "3.8.29", + "@react-stately/table": "3.15.2", "@react-stately/virtualizer": "4.4.4", "@react-types/grid": "3.3.6", "@react-types/table": "3.13.4", @@ -2196,208 +2228,122 @@ }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/tabs": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/tabs/-/tabs-2.2.24.tgz", - "integrity": "sha512-2SfxzAXe1t2Zz0v16kqkb7DR2wW86XoDwRUpLex6zhEN4/uT5ILeynxIVSUyAvVN3z95cnaQt0XPQBfUjAIQhQ==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/tabs/-/tabs-2.2.26.tgz", + "integrity": "sha512-RK5TjDI2KY1i/zyO/zzwkiDnQEYxcXSu9QCigNLcCZ6SXq0J3n83FC5Vv91kFwU9aTRuwdxIHv5KzV7D8Xe14w==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", + "@heroui/aria-utils": "2.2.26", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", "@heroui/use-is-mounted": "2.1.8", - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/tabs": "3.10.8", - "@react-stately/tabs": "3.8.6", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/tabs": "3.10.9", + "@react-stately/tabs": "3.8.7", "@react-types/shared": "3.32.1", "scroll-into-view-if-needed": "3.0.10" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.22", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/theme": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.23.tgz", - "integrity": "sha512-5hoaRWG+/d/t06p7Pfhz70DUP0Uggjids7/z2Ytgup4A8KAOvDIXxvHUDlk6rRHKiN1wDMNA5H+EWsSXB/m03Q==", + "version": "2.4.25", + "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.25.tgz", + "integrity": "sha512-nTptYhO1V9rMoh9SJDnMfaSmFuoXvbem1UuwgHcraRtqy/TIVBPqv26JEGzSoUCL194TDGOJpqrpMuab/PdXcw==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12", - "clsx": "^1.2.1", "color": "^4.2.3", "color2k": "^2.0.3", "deepmerge": "4.3.1", "flat": "^5.0.2", - "tailwind-merge": "3.3.1", - "tailwind-variants": "3.1.1" + "tailwind-merge": "3.4.0", + "tailwind-variants": "3.2.2" }, "peerDependencies": { "tailwindcss": ">=4.0.0" } }, "node_modules/@heroui/react/node_modules/@heroui/toast": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@heroui/toast/-/toast-2.0.17.tgz", - "integrity": "sha512-w3TaA1DYLcwdDjpwf9xw5YSr+odo9GGHsObsrMmLEQDS0JQhmKyK5sQqXUzb9d27EC6KVwGjeVg0hUHYQBK2JA==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@heroui/toast/-/toast-2.0.19.tgz", + "integrity": "sha512-KUl/vIMoZQxpjLPxx57XKh39Ai1CyPqm+1Pn20xOVk0fV+2SqC7OW6xivwwBnS7rysx8JfMHwNVJUHTU0o9K1Q==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", "@heroui/shared-icons": "2.1.10", "@heroui/shared-utils": "2.1.12", - "@heroui/spinner": "2.2.24", + "@heroui/spinner": "2.2.26", "@heroui/use-is-mobile": "2.2.12", - "@react-aria/interactions": "3.25.6", - "@react-aria/toast": "3.0.8", + "@react-aria/interactions": "3.26.0", + "@react-aria/toast": "3.0.9", "@react-stately/toast": "3.1.2" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/tooltip": { - "version": "2.2.24", - "resolved": "https://registry.npmjs.org/@heroui/tooltip/-/tooltip-2.2.24.tgz", - "integrity": "sha512-H+0STFea2/Z4obDdk+ZPoDzJxJQHIWGSjnW/jieThJbJ5zow/qBfcg5DqzIdiC+FCJ4dDD5jEDZ4W4H/fQUKQA==", + "version": "2.2.26", + "resolved": "https://registry.npmjs.org/@heroui/tooltip/-/tooltip-2.2.26.tgz", + "integrity": "sha512-VERreBoBAjqFLvJmBMVvRCYGxr+nq8gcncC14ewWqCzWwv/WQm9wVSqHLnwCtZelOz7ofaDDqvxmGjMqzMnqFw==", "license": "MIT", "dependencies": { - "@heroui/aria-utils": "2.2.24", + "@heroui/aria-utils": "2.2.26", "@heroui/dom-animation": "2.1.10", - "@heroui/framer-utils": "2.1.23", + "@heroui/framer-utils": "2.1.25", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@heroui/use-aria-overlay": "2.0.4", + "@heroui/use-aria-overlay": "2.0.5", "@heroui/use-safe-layout-effect": "2.1.8", - "@react-aria/overlays": "3.30.0", - "@react-aria/tooltip": "3.8.8", - "@react-stately/tooltip": "3.5.8", + "@react-aria/overlays": "3.31.0", + "@react-aria/tooltip": "3.9.0", + "@react-stately/tooltip": "3.5.9", "@react-types/overlays": "3.9.2", - "@react-types/tooltip": "3.4.21" + "@react-types/tooltip": "3.5.0" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/react/node_modules/@heroui/user": { - "version": "2.2.22", - "resolved": "https://registry.npmjs.org/@heroui/user/-/user-2.2.22.tgz", - "integrity": "sha512-kOLxh9Bjgl/ya/f+W7/eKVO/n1GPsU5TPzwocC9+FU/+MbCOrmkevhAGGUrb259KCnp9WCv7WGRIcf8rrsreDw==", + "version": "2.2.24", + "resolved": "https://registry.npmjs.org/@heroui/user/-/user-2.2.24.tgz", + "integrity": "sha512-SH8MlILc1Nn7lBvbvsqNok6H36+FrhT9VIQlKwzzX/tidr15LRK74F1k8UPV7PBAxDKxQ0FRCictCXI8dN9lcQ==", "license": "MIT", "dependencies": { - "@heroui/avatar": "2.2.22", + "@heroui/avatar": "2.2.24", "@heroui/react-utils": "2.1.14", "@heroui/shared-utils": "2.1.12", - "@react-aria/focus": "3.21.2" + "@react-aria/focus": "3.21.3" }, "peerDependencies": { "@heroui/system": ">=2.4.18", - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.24", "react": ">=18 || >=19.0.0-rc.0", "react-dom": ">=18 || >=19.0.0-rc.0" } }, - "node_modules/@heroui/react/node_modules/@react-aria/form": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@react-aria/form/-/form-3.1.2.tgz", - "integrity": "sha512-R3i7L7Ci61PqZQvOrnL9xJeWEbh28UkTVgkj72EvBBn39y4h7ReH++0stv7rRs8p5ozETSKezBbGfu4UsBewWw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", - "@react-stately/form": "^3.2.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@heroui/react/node_modules/@react-aria/listbox": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.15.0.tgz", - "integrity": "sha512-Ub1Wu79R9sgxM7h4HeEdjOgOKDHwduvYcnDqsSddGXgpkL8ADjsy2YUQ0hHY5VnzA4BxK36bLp4mzSna8Qvj1w==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/selection": "^3.26.0", - "@react-aria/utils": "^3.31.0", - "@react-stately/collections": "^3.12.8", - "@react-stately/list": "^3.13.1", - "@react-types/listbox": "^3.7.4", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@heroui/react/node_modules/@react-aria/menu": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.19.3.tgz", - "integrity": "sha512-52fh8y8b2776R2VrfZPpUBJYC9oTP7XDy+zZuZTxPEd7Ywk0JNUl5F92y6ru22yPkS13sdhrNM/Op+V/KulmAg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/overlays": "^3.30.0", - "@react-aria/selection": "^3.26.0", - "@react-aria/utils": "^3.31.0", - "@react-stately/collections": "^3.12.8", - "@react-stately/menu": "^3.9.8", - "@react-stately/selection": "^3.20.6", - "@react-stately/tree": "^3.9.3", - "@react-types/button": "^3.14.1", - "@react-types/menu": "^3.10.5", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@heroui/react/node_modules/@react-aria/textfield": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/@react-aria/textfield/-/textfield-3.18.2.tgz", - "integrity": "sha512-G+lM8VYSor6g9Yptc6hLZ6BF+0cq0pYol1z6wdQUQgJN8tg4HPtzq75lsZtlCSIznL3amgRAxJtd0dUrsAnvaQ==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/form": "^3.1.2", - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/utils": "^3.31.0", - "@react-stately/form": "^3.2.2", - "@react-stately/utils": "^3.10.8", - "@react-types/shared": "^3.32.1", - "@react-types/textfield": "^3.12.6", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@heroui/react/node_modules/@tanstack/react-virtual": { "version": "3.11.3", "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.11.3.tgz", @@ -2425,24 +2371,47 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@heroui/react/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "node_modules/@heroui/react/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, "engines": { - "node": ">=6" + "node": ">=12.5.0" } }, - "node_modules/@heroui/react/node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "node_modules/@heroui/react/node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "license": "MIT", - "peer": true + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, - "node_modules/@heroui/shared-icons": { - "version": "2.1.10", + "node_modules/@heroui/react/node_modules/scroll-into-view-if-needed": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", + "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^3.0.2" + } + }, + "node_modules/@heroui/react/node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT", + "peer": true + }, + "node_modules/@heroui/shared-icons": { + "version": "2.1.10", "resolved": "https://registry.npmjs.org/@heroui/shared-icons/-/shared-icons-2.1.10.tgz", "integrity": "sha512-ePo60GjEpM0SEyZBGOeySsLueNDCqLsVL79Fq+5BphzlrBAcaKY7kUp74964ImtkXvknTxAWzuuTr3kCRqj6jg==", "license": "MIT", @@ -2458,16 +2427,16 @@ "license": "MIT" }, "node_modules/@heroui/system": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@heroui/system/-/system-2.4.23.tgz", - "integrity": "sha512-kgYvfkIOQKM6CCBIlNSE2tXMtNrS1mvEUbvwnaU3pEYbMlceBtwA5v7SlpaJy/5dqKcTbfmVMUCmXnY/Kw4vaQ==", + "version": "2.4.25", + "resolved": "https://registry.npmjs.org/@heroui/system/-/system-2.4.25.tgz", + "integrity": "sha512-F6UUoGTQ+Qas5wYkCzLjXE7u74Z9ygO0u0+dkTW7zCaY7ds65CcmvZ/ahKz2ES3Tk6TNks1MJSyaQ9rFLs8AqA==", "license": "MIT", "dependencies": { "@heroui/react-utils": "2.1.14", - "@heroui/system-rsc": "2.3.20", - "@react-aria/i18n": "3.12.13", - "@react-aria/overlays": "3.30.0", - "@react-aria/utils": "3.31.0" + "@heroui/system-rsc": "2.3.21", + "@react-aria/i18n": "3.12.14", + "@react-aria/overlays": "3.31.0", + "@react-aria/utils": "3.32.0" }, "peerDependencies": { "framer-motion": ">=11.5.6 || >=12.0.0-alpha.1", @@ -2476,23 +2445,22 @@ } }, "node_modules/@heroui/system/node_modules/@heroui/system-rsc": { - "version": "2.3.20", - "resolved": "https://registry.npmjs.org/@heroui/system-rsc/-/system-rsc-2.3.20.tgz", - "integrity": "sha512-uZwQErEud/lAX7KRXEdsDcGLyygBffHcgnbCDrLvmTf3cyBE84YziG7AjM7Ts8ZcrF+wBXX4+a1IqnKGlsGEdQ==", + "version": "2.3.21", + "resolved": "https://registry.npmjs.org/@heroui/system-rsc/-/system-rsc-2.3.21.tgz", + "integrity": "sha512-icB7njbNgkI3dcfZhY5LP7VFspaVgWL1lcg9Q7uJMAaj6gGFqqSSnHkSMwpR9AGLxVRKTHey0TUx8CeZDe8XDw==", "license": "MIT", "dependencies": { - "@react-types/shared": "3.32.1", - "clsx": "^1.2.1" + "@react-types/shared": "3.32.1" }, "peerDependencies": { - "@heroui/theme": ">=2.4.17", + "@heroui/theme": ">=2.4.23", "react": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/system/node_modules/@heroui/theme": { - "version": "2.4.24", - "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.24.tgz", - "integrity": "sha512-lL+anmY4GGWwKyTbJ2PEBZE4talIZ3hu4yGpku9TktCVG2nC2YTwiWQFJ+Jcbf8Cf9vuLzI1sla5bz2jUqiBRA==", + "version": "2.4.25", + "resolved": "https://registry.npmjs.org/@heroui/theme/-/theme-2.4.25.tgz", + "integrity": "sha512-nTptYhO1V9rMoh9SJDnMfaSmFuoXvbem1UuwgHcraRtqy/TIVBPqv26JEGzSoUCL194TDGOJpqrpMuab/PdXcw==", "license": "MIT", "peer": true, "dependencies": { @@ -2508,44 +2476,29 @@ "tailwindcss": ">=4.0.0" } }, - "node_modules/@heroui/system/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@heroui/system/node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "node_modules/@heroui/system/node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "license": "MIT", "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" } }, - "node_modules/@heroui/system/node_modules/tailwind-variants": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", - "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", + "node_modules/@heroui/system/node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "license": "MIT", "peer": true, - "engines": { - "node": ">=16.x", - "pnpm": ">=7.x" - }, - "peerDependencies": { - "tailwind-merge": ">=3.0.0", - "tailwindcss": "*" - }, - "peerDependenciesMeta": { - "tailwind-merge": { - "optional": true - } + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, "node_modules/@heroui/system/node_modules/tailwindcss": { @@ -2556,15 +2509,15 @@ "peer": true }, "node_modules/@heroui/use-aria-accordion": { - "version": "2.2.18", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-accordion/-/use-aria-accordion-2.2.18.tgz", - "integrity": "sha512-qjRkae2p4MFDrNqO6v6YCor0BtVi3idMd1dsI82XM16bxLQ2stqG4Ajrg60xV0AN+WKZUq10oetqkJuY6MYg0w==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-accordion/-/use-aria-accordion-2.2.19.tgz", + "integrity": "sha512-4HGY2zr+MIzRtIO9epFQGeU7VeGqhCotxxXzscfwxLfEeHBJwQvMAsu7yrUQ/uyMGvSiohHlJRgIsuT1xzxH1Q==", "license": "MIT", "dependencies": { - "@react-aria/button": "3.14.2", - "@react-aria/focus": "3.21.2", - "@react-aria/selection": "3.26.0", - "@react-stately/tree": "3.9.3", + "@react-aria/button": "3.14.3", + "@react-aria/focus": "3.21.3", + "@react-aria/selection": "3.27.0", + "@react-stately/tree": "3.9.4", "@react-types/accordion": "3.0.0-alpha.26", "@react-types/shared": "3.32.1" }, @@ -2573,14 +2526,14 @@ } }, "node_modules/@heroui/use-aria-button": { - "version": "2.2.20", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-button/-/use-aria-button-2.2.20.tgz", - "integrity": "sha512-Y0Bmze/pxEACKsHMbA1sYA3ghMJ+9fSnWvZBwlUxqiVXDEy2YrrK2JmXEgsuHGQdKD9RqU2Od3V4VqIIiaHiMA==", + "version": "2.2.21", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-button/-/use-aria-button-2.2.21.tgz", + "integrity": "sha512-8Lhjt1xoDpjhqvEbFC21NEgU89p7Z+MAzrDyoF1eYUn/w4ahhBgcQStP6WicLfx50tOE10WDpPBq72tah/O+ww==", "license": "MIT", "dependencies": { - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/utils": "3.31.0", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/utils": "3.32.0", "@react-types/button": "3.14.1", "@react-types/shared": "3.32.1" }, @@ -2589,14 +2542,14 @@ } }, "node_modules/@heroui/use-aria-link": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-link/-/use-aria-link-2.2.21.tgz", - "integrity": "sha512-sG2rUutT/E/FYguzZmg715cXcM6+ue9wRfs2Gi6epWJwIVpS51uEagJKY0wIutJDfuCPfQ9AuxXfJek4CnxjKw==", + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-link/-/use-aria-link-2.2.22.tgz", + "integrity": "sha512-T7wESiV9IBqe5MILMZ1pL+GIWxyPVj7ag/KUhZUH3v/dm94m+f2Ua7rXxzI+hj2H51s189YP+Eb1PagHMDrfPg==", "license": "MIT", "dependencies": { - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/utils": "3.31.0", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/utils": "3.32.0", "@react-types/link": "3.6.5", "@react-types/shared": "3.32.1" }, @@ -2605,15 +2558,15 @@ } }, "node_modules/@heroui/use-aria-modal-overlay": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-modal-overlay/-/use-aria-modal-overlay-2.2.19.tgz", - "integrity": "sha512-MPvszNrt+1DauiSyOAwb0pKbYahpEVi9hrmidnO8cd1SA7B2ES0fNRBeNMAwcaeR/Nzsv+Cw1hRXt3egwqi0lg==", + "version": "2.2.20", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-modal-overlay/-/use-aria-modal-overlay-2.2.20.tgz", + "integrity": "sha512-AIYfpnpiRVJm3InKlroGqQSZ1hjBI0Y5oMhMrXuQqrySsMKzMye3zMcEBWf8dEho1l+/U0dgNIUJFbkEFsOc8w==", "license": "MIT", "dependencies": { - "@heroui/use-aria-overlay": "2.0.4", - "@react-aria/overlays": "3.30.0", - "@react-aria/utils": "3.31.0", - "@react-stately/overlays": "3.6.20" + "@heroui/use-aria-overlay": "2.0.5", + "@react-aria/overlays": "3.31.0", + "@react-aria/utils": "3.32.0", + "@react-stately/overlays": "3.6.21" }, "peerDependencies": { "react": ">=18 || >=19.0.0-rc.0", @@ -2621,21 +2574,21 @@ } }, "node_modules/@heroui/use-aria-multiselect": { - "version": "2.4.19", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-multiselect/-/use-aria-multiselect-2.4.19.tgz", - "integrity": "sha512-RLDSpOLJqNESn6OK/zKuyTriK6sqMby76si/4kTMCs+4lmMPOyFKP3fREywu+zyJjRUCuZPa6xYuN2OHKQRDow==", - "license": "MIT", - "dependencies": { - "@react-aria/i18n": "3.12.13", - "@react-aria/interactions": "3.25.6", - "@react-aria/label": "3.7.22", - "@react-aria/listbox": "3.15.0", - "@react-aria/menu": "3.19.3", - "@react-aria/selection": "3.26.0", - "@react-aria/utils": "3.31.0", + "version": "2.4.20", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-multiselect/-/use-aria-multiselect-2.4.20.tgz", + "integrity": "sha512-Tvbk2AaWfGYgL6Sn9SwsI+nSOcaD1e3wWGPEqHzeFgoSV6cT7oLY70TODD/HyTF+LKYPtYUbAenxDd80Z5j+Eg==", + "license": "MIT", + "dependencies": { + "@react-aria/i18n": "3.12.14", + "@react-aria/interactions": "3.26.0", + "@react-aria/label": "3.7.23", + "@react-aria/listbox": "3.15.1", + "@react-aria/menu": "3.19.4", + "@react-aria/selection": "3.27.0", + "@react-aria/utils": "3.32.0", "@react-stately/form": "3.2.2", - "@react-stately/list": "3.13.1", - "@react-stately/menu": "3.9.8", + "@react-stately/list": "3.13.2", + "@react-stately/menu": "3.9.9", "@react-types/button": "3.14.1", "@react-types/overlays": "3.9.2", "@react-types/shared": "3.32.1" @@ -2645,77 +2598,15 @@ "react-dom": ">=18 || >=19.0.0-rc.0" } }, - "node_modules/@heroui/use-aria-multiselect/node_modules/@react-aria/label": { - "version": "3.7.22", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.22.tgz", - "integrity": "sha512-jLquJeA5ZNqDT64UpTc9XJ7kQYltUlNcgxZ37/v4mHe0UZ7QohCKdKQhXHONb0h2jjNUpp2HOZI8J9++jOpzxA==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/utils": "^3.31.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@heroui/use-aria-multiselect/node_modules/@react-aria/listbox": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.15.0.tgz", - "integrity": "sha512-Ub1Wu79R9sgxM7h4HeEdjOgOKDHwduvYcnDqsSddGXgpkL8ADjsy2YUQ0hHY5VnzA4BxK36bLp4mzSna8Qvj1w==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/selection": "^3.26.0", - "@react-aria/utils": "^3.31.0", - "@react-stately/collections": "^3.12.8", - "@react-stately/list": "^3.13.1", - "@react-types/listbox": "^3.7.4", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@heroui/use-aria-multiselect/node_modules/@react-aria/menu": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.19.3.tgz", - "integrity": "sha512-52fh8y8b2776R2VrfZPpUBJYC9oTP7XDy+zZuZTxPEd7Ywk0JNUl5F92y6ru22yPkS13sdhrNM/Op+V/KulmAg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/overlays": "^3.30.0", - "@react-aria/selection": "^3.26.0", - "@react-aria/utils": "^3.31.0", - "@react-stately/collections": "^3.12.8", - "@react-stately/menu": "^3.9.8", - "@react-stately/selection": "^3.20.6", - "@react-stately/tree": "^3.9.3", - "@react-types/button": "^3.14.1", - "@react-types/menu": "^3.10.5", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@heroui/use-aria-overlay": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@heroui/use-aria-overlay/-/use-aria-overlay-2.0.4.tgz", - "integrity": "sha512-iv+y0+OvQd1eWiZftPI07JE3c5AdK85W5k3rDlhk5MFEI3dllkIpu8z8zLh3ge/BQGFiGkySVC5iXl8w84gMUQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@heroui/use-aria-overlay/-/use-aria-overlay-2.0.5.tgz", + "integrity": "sha512-2g1HxRoDzGAqIkW7s09WEXg+SAWslh+ZkIuixNAqsA60FHSAzQtGCNpbE2yFeMrukhbmRfS8t3hT2JVZVAXG7w==", "license": "MIT", "dependencies": { - "@react-aria/focus": "3.21.2", - "@react-aria/interactions": "3.25.6", - "@react-aria/overlays": "3.30.0", + "@react-aria/focus": "3.21.3", + "@react-aria/interactions": "3.26.0", + "@react-aria/overlays": "3.31.0", "@react-types/shared": "3.32.1" }, "peerDependencies": { @@ -2757,26 +2648,26 @@ } }, "node_modules/@heroui/use-disclosure": { - "version": "2.2.17", - "resolved": "https://registry.npmjs.org/@heroui/use-disclosure/-/use-disclosure-2.2.17.tgz", - "integrity": "sha512-S3pN0WmpcTTZuQHcXw4RcTVsxLaCZ95H5qi/JPN83ahhWTCC+pN8lwE37vSahbMTM1YriiHyTM6AWpv/E3Jq7w==", + "version": "2.2.18", + "resolved": "https://registry.npmjs.org/@heroui/use-disclosure/-/use-disclosure-2.2.18.tgz", + "integrity": "sha512-aR/4oITXOyt8uze9EdfL/b2j8pg75dc92Q8FfoT17MibD6nKI1VmQDA+9CAtUwuKq6rSrEGqc14muO3GYpTH4g==", "license": "MIT", "dependencies": { "@heroui/use-callback-ref": "2.1.8", - "@react-aria/utils": "3.31.0", - "@react-stately/utils": "3.10.8" + "@react-aria/utils": "3.32.0", + "@react-stately/utils": "3.11.0" }, "peerDependencies": { "react": ">=18 || >=19.0.0-rc.0" } }, "node_modules/@heroui/use-draggable": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/@heroui/use-draggable/-/use-draggable-2.1.18.tgz", - "integrity": "sha512-ihQdmLGYJ6aTEaJ0/yCXYn6VRdrRV2eO03XD2A3KANZPb1Bj/n4r298xNMql5VnGq5ZNDJB9nTv8NNCu9pmPdg==", + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/@heroui/use-draggable/-/use-draggable-2.1.19.tgz", + "integrity": "sha512-pk0Oe4QLcjr1gndcuvq+8z6eoM+v3lvbmEDxbsEjeST9AwykfmT/60X+xrPFtCkfYldYXk1UxBPiGwrFs0lscQ==", "license": "MIT", "dependencies": { - "@react-aria/interactions": "3.25.6" + "@react-aria/interactions": "3.26.0" }, "peerDependencies": { "react": ">=18 || >=19.0.0-rc.0" @@ -2844,13 +2735,13 @@ } }, "node_modules/@heroui/use-pagination": { - "version": "2.2.18", - "resolved": "https://registry.npmjs.org/@heroui/use-pagination/-/use-pagination-2.2.18.tgz", - "integrity": "sha512-qm1mUe5UgV0kPZItcs/jiX/BxzdDagmcxaJkYR6DkhfMRoCuOdoJhcoh8ncbCAgHpzPESPn1VxsOcG4/Y+Jkdw==", + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/@heroui/use-pagination/-/use-pagination-2.2.19.tgz", + "integrity": "sha512-0VLyxge+rPBexK7xoLgPwCC8ngh9vIgHEtS+sRvulcEy4grG9EvZWUfMpMeiboFc5Ku2l5u+D9jYkaV06EY4Rw==", "license": "MIT", "dependencies": { "@heroui/shared-utils": "2.1.12", - "@react-aria/i18n": "3.12.13" + "@react-aria/i18n": "3.12.14" }, "peerDependencies": { "react": ">=18 || >=19.0.0-rc.0" @@ -2892,6 +2783,18 @@ "react": ">=18 || >=19.0.0-rc.0" } }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", @@ -3383,9 +3286,9 @@ } }, "node_modules/@internationalized/date": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.0.tgz", - "integrity": "sha512-oxDR/NTEJ1k+UFVQElaNIk65E/Z83HK1z1WI3lQyhTtnNg4R5oVXaPzK3jcpKG8UHKDVuDQHzn+wsxSz8RP3aw==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", + "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -3640,11 +3543,12 @@ "license": "BSD-2-Clause" }, "node_modules/@modelcontextprotocol/sdk": { - "version": "1.24.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.24.3.tgz", - "integrity": "sha512-YgSHW29fuzKKAHTGe9zjNoo+yF8KaQPzDC2W9Pv41E7/57IfY+AMGJ/aDFlgTLcVVELoggKE4syABCE75u3NCw==", + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", + "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", "license": "MIT", "dependencies": { + "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", @@ -3655,6 +3559,7 @@ "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", @@ -3727,26 +3632,30 @@ "license": "MIT" }, "node_modules/@platejs/autoformat": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/autoformat/-/autoformat-52.0.1.tgz", - "integrity": "sha512-eLXtzOiXJIbWO3nzp0wcdZsh0JI3ePvmxFY9Yhl4dIQYVGGq9kZaRR+HucmVH7nV3Oirsq3WSR/nrdby6GwEdA==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/autoformat/-/autoformat-52.0.11.tgz", + "integrity": "sha512-5/pLa0uAOrN/jfwpEWEhk/5G9wmSD12EnBnVDP0lB2tuosOzyMCH0rNylMYwgLFACNO7goLw7ka6tvjJ1ErxtQ==", "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "node_modules/@platejs/basic-nodes": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/basic-nodes/-/basic-nodes-52.0.1.tgz", - "integrity": "sha512-s6leoufEsraw1sFmXD73OA45UisCvAiU7+w5t4kkRTJqYMpvUPzAvpOP+gW4JC5GJ8/dptLZ2uSuaJd9YyeHcA==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/basic-nodes/-/basic-nodes-52.0.11.tgz", + "integrity": "sha512-vvjSybGRdY/dZoQKUItX7Jou0W0VdLYA7C9OtqTKL9DD5DuRTp4+/7WZTFgS255ZH4lodxfUCsFNRkeIzzm8EQ==", "license": "MIT", + "dependencies": { + "react-compiler-runtime": "^1.0.0" + }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } @@ -3766,9 +3675,9 @@ } }, "node_modules/@platejs/core": { - "version": "52.0.11", - "resolved": "https://registry.npmjs.org/@platejs/core/-/core-52.0.11.tgz", - "integrity": "sha512-wLROu2EOgY6bbQxUxltl+j87QXSujafJAZ13/YLyQGae5pIJsUANnBARVlSqXxnll8g/pXnhCJ1DJw1F+WGvlg==", + "version": "52.0.17", + "resolved": "https://registry.npmjs.org/@platejs/core/-/core-52.0.17.tgz", + "integrity": "sha512-AXwt/GfotU/+0WsCxVOI3tCR7svIX2eT+yGTCHriSDAPJYrRq6qxGUBzDJWV7M16Zh3ihMPHpE+sfOhnCfdYeg==", "license": "MIT", "dependencies": { "@platejs/slate": "52.0.10", @@ -3798,35 +3707,18 @@ "react-dom": ">=18.0.0" } }, - "node_modules/@platejs/core/node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, "node_modules/@platejs/dnd": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/dnd/-/dnd-52.0.1.tgz", - "integrity": "sha512-z2T8CxbfjSyDqmOmruzqYPH/na2AbGQvq/jNdFxgsfptmBihZ030g91ua8kAYYsqRTH7VvN/URpunMqUtviu7A==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/dnd/-/dnd-52.0.11.tgz", + "integrity": "sha512-iXWDHCzD0JE55E9AZGeWN+ZZkgaaxYNg4llRFryV2FVbMbFj2u7rca3Qv/YTvAinqbI8nswO4EhuP5JHSUNdMQ==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", - "raf": "^3.4.1" + "raf": "^3.4.1", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dnd": ">=14.0.0", "react-dnd-html5-backend": ">=14.0.0", @@ -3834,27 +3726,46 @@ } }, "node_modules/@platejs/floating": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/floating/-/floating-52.0.1.tgz", - "integrity": "sha512-Z9YocQIRClu3akdUu9unX01Tv8ME8SRvSFcxIkA+hknpL9iLV0HZzAoMeXxVPpfs5t88SfaomrKHH8RV6dhFVg==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/floating/-/floating-52.0.11.tgz", + "integrity": "sha512-ApNpw4KWml+kuK+XTTpji+f/7GxTR4nRzlnfJMvGBrJpLPQ4elS5MABm3oUi81DZn+aub5HvsyH7UqCw7F76IA==", "license": "MIT", "dependencies": { "@floating-ui/core": "^1.7.1", - "@floating-ui/react": "^0.27.12" + "@floating-ui/react": "^0.27.12", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, + "node_modules/@platejs/floating/node_modules/@floating-ui/react": { + "version": "0.27.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.16.tgz", + "integrity": "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.6", + "@floating-ui/utils": "^0.2.10", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=17.0.0", + "react-dom": ">=17.0.0" + } + }, "node_modules/@platejs/indent": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/indent/-/indent-52.0.1.tgz", - "integrity": "sha512-sbMizZYlvmYenxfbY3RARLrM6HRuIFCbnQfJ1LMfy2tf7OjhZz/A15ACcmjyqvdZtVF54JtW3q6hiQQPMuMTAQ==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/indent/-/indent-52.0.11.tgz", + "integrity": "sha512-CZYFOZObce4yzQal/coKtPzp2+N+DiLetLiYR2U8z4Tgc9da/Fsj11DNR7CorVcdNmBPWkr3vwbTwuSayNOYgQ==", "license": "MIT", + "dependencies": { + "react-compiler-runtime": "^1.0.0" + }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } @@ -3874,57 +3785,61 @@ } }, "node_modules/@platejs/link": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/link/-/link-52.0.1.tgz", - "integrity": "sha512-IlUB0QKnsnkgMshm0xz2Rqj5Z1rE3FHuVo/umjBm7fWJCbldXps340rPA59LfaDctF3jZYQlf+PFd6Zxaw4Q8A==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/link/-/link-52.0.11.tgz", + "integrity": "sha512-ykfTL1NtvDJYGbp+QZiZU+N1WNo5xLiInuBl/Gb/EVeI/PU8He1PLR1ub/zhIuJiiT487u07QT5b4jltvnd86g==", "license": "MIT", "dependencies": { - "@platejs/floating": "52.0.1" + "@platejs/floating": "52.0.11", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "node_modules/@platejs/list": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/list/-/list-52.0.1.tgz", - "integrity": "sha512-d9IjfzjaIcfycRGsRagaTi9dYNMALq2aq+BGgm/CHhw8JL/dxzMKfz9d2yQFQ7q3cCGMiIxiHtHOWkybfevVKQ==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/list/-/list-52.0.11.tgz", + "integrity": "sha512-azmJhBRQsjoWLwVWgTfHxegTg02k81sEJinwNv5gDPyiDlK1Pk98Oys/7H21SpwRWh75tPR/9JfV0ZGMqAHEJA==", "license": "MIT", "dependencies": { - "@platejs/indent": "52.0.1", - "clsx": "^2.1.1" + "@platejs/indent": "52.0.11", + "clsx": "^2.1.1", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "node_modules/@platejs/list-classic": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/list-classic/-/list-classic-52.0.1.tgz", - "integrity": "sha512-U0Yth/0scWUG55MoBb7L26G3qIfa1ijnU9meqs5cEiytu6haaBT4PAeymG2hB52eYeEtjHbEg8Ft2+90gyPYZQ==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/list-classic/-/list-classic-52.0.11.tgz", + "integrity": "sha512-cuR0UJcfT7X45dvptofbozEznx604Y263pjlK7vLFerI2k7cUBuXRKOxtUuwVD4VaWE5aHCr8cO+nb+jhdGHSQ==", "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "node_modules/@platejs/markdown": { - "version": "52.0.10", - "resolved": "https://registry.npmjs.org/@platejs/markdown/-/markdown-52.0.10.tgz", - "integrity": "sha512-2cqhKxu45TFVFHgCCRn5x69t+kRPDwHw51pwrhch5urEmTzEnoK57H6JBsELUQ68v4Ujgtg52KbewO+GKdNyog==", + "version": "52.1.0", + "resolved": "https://registry.npmjs.org/@platejs/markdown/-/markdown-52.1.0.tgz", + "integrity": "sha512-4443H09CJ4AH1449TERm7ot5aFji4rKt+iHIZdB7FiIBz9Coki5+JkKcRn9gEq7lpjMQ9E/MD2J9ejnmglc1/A==", "license": "MIT", "dependencies": { "marked": "^15.0.12", "mdast-util-math": "3.0.0", "mdast-util-mdx": "3.0.0", + "react-compiler-runtime": "^1.0.0", "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", @@ -3932,7 +3847,7 @@ "unified": "^11.0.5" }, "peerDependencies": { - "platejs": ">=52.0.10", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } @@ -3953,12 +3868,15 @@ } }, "node_modules/@platejs/resizable": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/resizable/-/resizable-52.0.1.tgz", - "integrity": "sha512-a5Md2pNQNSK1yXOUfe5ABE2qXFLPtMNdzm9rcSYUERzL9j55GfIU4QXgb72EIaWfTuncCdO7FmTGUzDSq9f9dA==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/resizable/-/resizable-52.0.11.tgz", + "integrity": "sha512-x2tvjr3XIonbuYseG9M5EqYwXoj+V69xdKIt+n8v2ltgsn7W1wJgzLO8tdBJCnKQPEGAvCFXUTlQAUNeQ1OYQA==", "license": "MIT", + "dependencies": { + "react-compiler-runtime": "^1.0.0" + }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } @@ -3977,27 +3895,28 @@ } }, "node_modules/@platejs/table": { - "version": "52.0.1", - "resolved": "https://registry.npmjs.org/@platejs/table/-/table-52.0.1.tgz", - "integrity": "sha512-FE7hxJgRFGPkWRCDhsvbdr++I52v9Y07LuCQWdBJYD62lkDCRsEUM4AUCUTCrTke6Vyk2prFUIQeNS89+SjuYA==", + "version": "52.0.11", + "resolved": "https://registry.npmjs.org/@platejs/table/-/table-52.0.11.tgz", + "integrity": "sha512-hOf4Ije8KBZtYcIKsbBONSrr9oDO5BqQntf6F1H3gGFgKZqkumjUPcaK2+WZ0PS1aMx5IKqQMzgR/woYhmQ11Q==", "license": "MIT", "dependencies": { - "@platejs/resizable": "52.0.1", - "lodash": "^4.17.21" + "@platejs/resizable": "52.0.11", + "lodash": "^4.17.21", + "react-compiler-runtime": "^1.0.0" }, "peerDependencies": { - "platejs": ">=52.0.1", + "platejs": ">=52.0.11", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "node_modules/@platejs/utils": { - "version": "52.0.11", - "resolved": "https://registry.npmjs.org/@platejs/utils/-/utils-52.0.11.tgz", - "integrity": "sha512-YQIzE6dxBsglau3kghQwVWaWwpC/OGm9ZkBLvCEuNBphD/n8uSG4wTZYoeqjEv5X0Ytewq+/lK2EKDBpY5+KJg==", + "version": "52.0.17", + "resolved": "https://registry.npmjs.org/@platejs/utils/-/utils-52.0.17.tgz", + "integrity": "sha512-9YvYnic+qo4bPJAPvFwWQLeG5zQ/OWe6hyA7b3sFhmSyuiLWQZklkHrE96iyHu4Jn31h3FndbG9AH7e36HFa1w==", "license": "MIT", "dependencies": { - "@platejs/core": "52.0.11", + "@platejs/core": "52.0.17", "@platejs/slate": "52.0.10", "@udecode/react-utils": "52.0.11", "@udecode/utils": "52.0.1", @@ -4108,14 +4027,14 @@ } }, "node_modules/@react-aria/breadcrumbs": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.29.tgz", - "integrity": "sha512-rKS0dryllaZJqrr3f/EAf2liz8CBEfmL5XACj+Z1TAig6GIYe1QuA3BtkX0cV9OkMugXdX8e3cbA7nD10ORRqg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@react-aria/breadcrumbs/-/breadcrumbs-3.5.30.tgz", + "integrity": "sha512-DZymglA70SwvDJA7GB147sUexvdDy6vWcriGrlEHhMMzBLhGB30I5J96R4pPzURLxXISrWFH56KC5rRgIqsqqg==", "license": "Apache-2.0", "dependencies": { - "@react-aria/i18n": "^3.12.13", - "@react-aria/link": "^3.8.6", - "@react-aria/utils": "^3.31.0", + "@react-aria/i18n": "^3.12.14", + "@react-aria/link": "^3.8.7", + "@react-aria/utils": "^3.32.0", "@react-types/breadcrumbs": "^3.7.17", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -4126,15 +4045,15 @@ } }, "node_modules/@react-aria/button": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.14.2.tgz", - "integrity": "sha512-VbLIA+Kd6f/MDjd+TJBUg2+vNDw66pnvsj2E4RLomjI9dfBuN7d+Yo2UnsqKVyhePjCUZ6xxa2yDuD63IOSIYA==", + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/@react-aria/button/-/button-3.14.3.tgz", + "integrity": "sha512-iJTuEECs9im7TwrCRZ0dvuwp8Gao0+I1IuYs1LQvJQgKLpgRH2/6jAiqb2bdAcoAjdbaMs7Xe0xUwURpVNkEyA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/toolbar": "3.0.0-beta.21", - "@react-aria/utils": "^3.31.0", - "@react-stately/toggle": "^3.9.2", + "@react-aria/interactions": "^3.26.0", + "@react-aria/toolbar": "3.0.0-beta.22", + "@react-aria/utils": "^3.32.0", + "@react-stately/toggle": "^3.9.3", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -4145,19 +4064,19 @@ } }, "node_modules/@react-aria/calendar": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.9.2.tgz", - "integrity": "sha512-uSLxLgOPRnEU4Jg59lAhUVA+uDx/55NBg4lpfsP2ynazyiJ5LCXmYceJi+VuOqMml7d9W0dB87OldOeLdIxYVA==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-aria/calendar/-/calendar-3.9.3.tgz", + "integrity": "sha512-F12UQ4zd8GIxpJxs9GAHzDD9Lby2hESHm0LF5tjsYBIOBJc5K7ICeeE5UqLMBPzgnEP5nfh1CKS8KhCB0mS7PA==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", + "@internationalized/date": "^3.10.1", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", - "@react-aria/utils": "^3.31.0", - "@react-stately/calendar": "^3.9.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/calendar": "^3.9.1", "@react-types/button": "^3.14.1", - "@react-types/calendar": "^3.8.0", + "@react-types/calendar": "^3.8.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -4167,19 +4086,19 @@ } }, "node_modules/@react-aria/checkbox": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.16.2.tgz", - "integrity": "sha512-29Mj9ZqXioJ0bcMnNGooHztnTau5pikZqX3qCRj5bYR3by/ZFFavYoMroh9F7s/MbFm/tsKX+Sf02lYFEdXRjA==", + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/@react-aria/checkbox/-/checkbox-3.16.3.tgz", + "integrity": "sha512-2p1haCUtERo5XavBAWNaX//dryNVnOOWfSKyzLs4UiCZR/NL0ttN+Nu/i445q0ipjLqZ6bBJtx0g0NNrubbU7Q==", "license": "Apache-2.0", "dependencies": { - "@react-aria/form": "^3.1.2", - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/toggle": "^3.12.2", - "@react-aria/utils": "^3.31.0", - "@react-stately/checkbox": "^3.7.2", + "@react-aria/form": "^3.1.3", + "@react-aria/interactions": "^3.26.0", + "@react-aria/label": "^3.7.23", + "@react-aria/toggle": "^3.12.3", + "@react-aria/utils": "^3.32.0", + "@react-stately/checkbox": "^3.7.3", "@react-stately/form": "^3.2.2", - "@react-stately/toggle": "^3.9.2", + "@react-stately/toggle": "^3.9.3", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -4190,25 +4109,25 @@ } }, "node_modules/@react-aria/combobox": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.14.0.tgz", - "integrity": "sha512-z4ro0Hma//p4nL2IJx5iUa7NwxeXbzSoZ0se5uTYjG1rUUMszg+wqQh/AQoL+eiULn7rs18JY9wwNbVIkRNKWA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/@react-aria/combobox/-/combobox-3.14.1.tgz", + "integrity": "sha512-wuP/4UQrGsYXLw1Gk8G/FcnUlHuoViA9G6w3LhtUgu5Q3E5DvASJalxej3NtyYU+4w4epD1gJidzosAL0rf8Ug==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/listbox": "^3.15.0", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/listbox": "^3.15.1", "@react-aria/live-announcer": "^3.4.4", - "@react-aria/menu": "^3.19.3", - "@react-aria/overlays": "^3.30.0", - "@react-aria/selection": "^3.26.0", - "@react-aria/textfield": "^3.18.2", - "@react-aria/utils": "^3.31.0", + "@react-aria/menu": "^3.19.4", + "@react-aria/overlays": "^3.31.0", + "@react-aria/selection": "^3.27.0", + "@react-aria/textfield": "^3.18.3", + "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", - "@react-stately/combobox": "^3.12.0", + "@react-stately/combobox": "^3.12.1", "@react-stately/form": "^3.2.2", "@react-types/button": "^3.14.1", - "@react-types/combobox": "^3.13.9", + "@react-types/combobox": "^3.13.10", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -4218,26 +4137,26 @@ } }, "node_modules/@react-aria/datepicker": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.15.2.tgz", - "integrity": "sha512-th078hyNqPf4P2K10su/y32zPDjs3lOYVdHvsL9/+5K1dnTvLHCK5vgUyLuyn8FchhF7cmHV49D+LZVv65PEpQ==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/@react-aria/datepicker/-/datepicker-3.15.3.tgz", + "integrity": "sha512-0KkLYeLs+IubHXb879n8dzzKU/NWcxC9DXtv7M/ofL7vAvMSTmaceYJcMW+2gGYhJVpyYz8B6bk0W7kTxgB3jg==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", + "@internationalized/date": "^3.10.1", "@internationalized/number": "^3.6.5", "@internationalized/string": "^3.2.7", - "@react-aria/focus": "^3.21.2", - "@react-aria/form": "^3.1.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/spinbutton": "^3.6.19", - "@react-aria/utils": "^3.31.0", - "@react-stately/datepicker": "^3.15.2", + "@react-aria/focus": "^3.21.3", + "@react-aria/form": "^3.1.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/label": "^3.7.23", + "@react-aria/spinbutton": "^3.7.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/datepicker": "^3.15.3", "@react-stately/form": "^3.2.2", "@react-types/button": "^3.14.1", - "@react-types/calendar": "^3.8.0", - "@react-types/datepicker": "^3.13.2", + "@react-types/calendar": "^3.8.1", + "@react-types/datepicker": "^3.13.3", "@react-types/dialog": "^3.5.22", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -4248,14 +4167,14 @@ } }, "node_modules/@react-aria/dialog": { - "version": "3.5.31", - "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.31.tgz", - "integrity": "sha512-inxQMyrzX0UBW9Mhraq0nZ4HjHdygQvllzloT1E/RlDd61lr3RbmJR6pLsrbKOTtSvDIBJpCso1xEdHCFNmA0Q==", + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@react-aria/dialog/-/dialog-3.5.32.tgz", + "integrity": "sha512-2puMjsJS2FtB8LiFuQDAdBSU4dt3lqdJn4FWt/8GL6l91RZBqp2Dnm5Obuee6rV2duNJZcSAUWsQZ/S1iW8Y2g==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/overlays": "^3.30.0", - "@react-aria/utils": "^3.31.0", + "@react-aria/interactions": "^3.26.0", + "@react-aria/overlays": "^3.31.0", + "@react-aria/utils": "^3.32.0", "@react-types/dialog": "^3.5.22", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -4266,13 +4185,13 @@ } }, "node_modules/@react-aria/focus": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.2.tgz", - "integrity": "sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==", + "version": "3.21.3", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.3.tgz", + "integrity": "sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", + "@react-aria/interactions": "^3.26.0", + "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" @@ -4299,64 +4218,17 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/form/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", + "node_modules/@react-aria/grid": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.14.6.tgz", + "integrity": "sha512-xagBKHNPu4Ovt/I5He7T/oIEq82MDMSrRi5Sw3oxSCwwtZpv+7eyKRSrFz9vrNUzNgWCcx5VHLE660bLdeVNDQ==", "license": "Apache-2.0", "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/form/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/form/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/grid": { - "version": "3.14.6", - "resolved": "https://registry.npmjs.org/@react-aria/grid/-/grid-3.14.6.tgz", - "integrity": "sha512-xagBKHNPu4Ovt/I5He7T/oIEq82MDMSrRi5Sw3oxSCwwtZpv+7eyKRSrFz9vrNUzNgWCcx5VHLE660bLdeVNDQ==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/live-announcer": "^3.4.4", - "@react-aria/selection": "^3.27.0", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/live-announcer": "^3.4.4", + "@react-aria/selection": "^3.27.0", "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/grid": "^3.11.7", @@ -4371,33 +4243,7 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/grid/node_modules/@internationalized/date": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", - "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/grid/node_modules/@react-aria/focus": { - "version": "3.21.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.3.tgz", - "integrity": "sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/grid/node_modules/@react-aria/i18n": { + "node_modules/@react-aria/i18n": { "version": "3.12.14", "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.14.tgz", "integrity": "sha512-zYvs1FlLamFD49uneX3i5mPHrAsB3OjVpSWApTcPw8ydxOaphQDp/Q1aqrbcxlrQCcxZdXWHuvLlbkNR4+8jzw==", @@ -4417,7 +4263,7 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/grid/node_modules/@react-aria/interactions": { + "node_modules/@react-aria/interactions": { "version": "3.26.0", "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", @@ -4434,92 +4280,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/grid/node_modules/@react-aria/selection": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.27.0.tgz", - "integrity": "sha512-4zgreuCu4QM4t2U7aF3mbMvIKCEkTEo6h6nGJvbyZALZ/eFtLTvUiV8/5CGDJRLGvgMvi3XxUeF9PZbpk5nMJg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-stately/selection": "^3.20.7", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/grid/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/grid/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/i18n": { - "version": "3.12.13", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.13.tgz", - "integrity": "sha512-YTM2BPg0v1RvmP8keHenJBmlx8FXUKsdYIEX7x6QWRd1hKlcDwphfjzvt0InX9wiLiPHsT5EoBTpuUk8SXc0Mg==", - "license": "Apache-2.0", - "dependencies": { - "@internationalized/date": "^3.10.0", - "@internationalized/message": "^3.1.8", - "@internationalized/number": "^3.6.5", - "@internationalized/string": "^3.2.7", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/interactions": { - "version": "3.25.6", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.25.6.tgz", - "integrity": "sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/label": { "version": "3.7.23", "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.23.tgz", @@ -4535,36 +4295,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/label/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/label/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/landmark": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@react-aria/landmark/-/landmark-3.0.8.tgz", @@ -4581,36 +4311,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/landmark/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/landmark/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/link": { "version": "3.8.7", "resolved": "https://registry.npmjs.org/@react-aria/link/-/link-3.8.7.tgz", @@ -4628,53 +4328,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/link/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/link/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/link/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/listbox": { "version": "3.15.1", "resolved": "https://registry.npmjs.org/@react-aria/listbox/-/listbox-3.15.1.tgz", @@ -4687,389 +4340,65 @@ "@react-aria/utils": "^3.32.0", "@react-stately/collections": "^3.12.8", "@react-stately/list": "^3.13.2", - "@react-types/listbox": "^3.7.4", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@internationalized/date": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", - "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-aria/focus": { - "version": "3.21.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.3.tgz", - "integrity": "sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-aria/i18n": { - "version": "3.12.14", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.14.tgz", - "integrity": "sha512-zYvs1FlLamFD49uneX3i5mPHrAsB3OjVpSWApTcPw8ydxOaphQDp/Q1aqrbcxlrQCcxZdXWHuvLlbkNR4+8jzw==", - "license": "Apache-2.0", - "dependencies": { - "@internationalized/date": "^3.10.1", - "@internationalized/message": "^3.1.8", - "@internationalized/number": "^3.6.5", - "@internationalized/string": "^3.2.7", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-aria/selection": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.27.0.tgz", - "integrity": "sha512-4zgreuCu4QM4t2U7aF3mbMvIKCEkTEo6h6nGJvbyZALZ/eFtLTvUiV8/5CGDJRLGvgMvi3XxUeF9PZbpk5nMJg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-stately/selection": "^3.20.7", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-stately/list": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.13.2.tgz", - "integrity": "sha512-dGFALuQWNNOkv7W12qSsXLF4mJHLeWeK2hVvdyj4SI8Vxku+BOfaVKuW3sn3mNiixI1dM/7FY2ip4kK+kv27vw==", - "license": "Apache-2.0", - "dependencies": { - "@react-stately/collections": "^3.12.8", - "@react-stately/selection": "^3.20.7", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/listbox/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/live-announcer": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.4.tgz", - "integrity": "sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/menu": { - "version": "3.19.4", - "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.19.4.tgz", - "integrity": "sha512-0A0DUEkEvZynmaD3zktHavM+EmgZSR/ht+g1ExS2jXe73CegA+dbSRfPl9eIKcHxaRrWOV96qMj2pTf0yWTBDg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/overlays": "^3.31.0", - "@react-aria/selection": "^3.27.0", - "@react-aria/utils": "^3.32.0", - "@react-stately/collections": "^3.12.8", - "@react-stately/menu": "^3.9.9", - "@react-stately/selection": "^3.20.7", - "@react-stately/tree": "^3.9.4", - "@react-types/button": "^3.14.1", - "@react-types/menu": "^3.10.5", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@internationalized/date": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", - "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/focus": { - "version": "3.21.3", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.3.tgz", - "integrity": "sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/i18n": { - "version": "3.12.14", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.14.tgz", - "integrity": "sha512-zYvs1FlLamFD49uneX3i5mPHrAsB3OjVpSWApTcPw8ydxOaphQDp/Q1aqrbcxlrQCcxZdXWHuvLlbkNR4+8jzw==", - "license": "Apache-2.0", - "dependencies": { - "@internationalized/date": "^3.10.1", - "@internationalized/message": "^3.1.8", - "@internationalized/number": "^3.6.5", - "@internationalized/string": "^3.2.7", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/overlays": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.31.0.tgz", - "integrity": "sha512-Vq41X1s8XheGIhGbbuqRJslJEX08qmMVX//dwuBaFX9T18mMR04tumKOMxp8Lz+vqwdGLvjNUYDMcgolL+AMjw==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-aria/visually-hidden": "^3.8.29", - "@react-stately/overlays": "^3.6.21", - "@react-types/button": "^3.14.1", - "@react-types/overlays": "^3.9.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/selection": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.27.0.tgz", - "integrity": "sha512-4zgreuCu4QM4t2U7aF3mbMvIKCEkTEo6h6nGJvbyZALZ/eFtLTvUiV8/5CGDJRLGvgMvi3XxUeF9PZbpk5nMJg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/focus": "^3.21.3", - "@react-aria/i18n": "^3.12.14", - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-stately/selection": "^3.20.7", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-aria/visually-hidden": { - "version": "3.8.29", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.29.tgz", - "integrity": "sha512-1joCP+MHBLd+YA6Gb08nMFfDBhOF0Kh1gR1SA8zoxEB5RMfQEEkufIB8k0GGwvHGSCK3gFyO8UAVsD0+rRYEyg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-stately/menu": { - "version": "3.9.9", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.9.tgz", - "integrity": "sha512-moW5JANxMxPilfR0SygpCWCZe7Ef09oadgzTZthRymNRv0PXVS9ad4wd1EkwuMvPH/n0uZLZE2s8hNyFDgyqPA==", - "license": "Apache-2.0", - "dependencies": { - "@react-stately/overlays": "^3.6.21", - "@react-types/menu": "^3.10.5", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/menu/node_modules/@react-stately/overlays": { - "version": "3.6.21", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.21.tgz", - "integrity": "sha512-7f25H1PS2g+SNvuWPEW30pSGqYNHxesCP4w+1RcV/XV1oQI7oP5Ji2WfI0QsJEFc9wP/ZO1pyjHNKpfLI3O88g==", - "license": "Apache-2.0", - "dependencies": { - "@react-stately/utils": "^3.11.0", - "@react-types/overlays": "^3.9.2", + "@react-types/listbox": "^3.7.4", + "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/menu/node_modules/@react-stately/tree": { - "version": "3.9.4", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.9.4.tgz", - "integrity": "sha512-Re1fdEiR0hHPcEda+7ecw+52lgGfFW0MAEDzFg9I6J/t8STQSP+1YC0VVVkv2xRrkLbKLPqggNKgmD8nggecnw==", + "node_modules/@react-aria/live-announcer": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@react-aria/live-announcer/-/live-announcer-3.4.4.tgz", + "integrity": "sha512-PTTBIjNRnrdJOIRTDGNifY2d//kA7GUAwRFJNOEwSNG4FW+Bq9awqLiflw0JkpyB0VNIwou6lqKPHZVLsGWOXA==", "license": "Apache-2.0", "dependencies": { - "@react-stately/collections": "^3.12.8", - "@react-stately/selection": "^3.20.7", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/menu/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", + "node_modules/@react-aria/menu": { + "version": "3.19.4", + "resolved": "https://registry.npmjs.org/@react-aria/menu/-/menu-3.19.4.tgz", + "integrity": "sha512-0A0DUEkEvZynmaD3zktHavM+EmgZSR/ht+g1ExS2jXe73CegA+dbSRfPl9eIKcHxaRrWOV96qMj2pTf0yWTBDg==", "license": "Apache-2.0", "dependencies": { + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/overlays": "^3.31.0", + "@react-aria/selection": "^3.27.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/collections": "^3.12.8", + "@react-stately/menu": "^3.9.9", + "@react-stately/selection": "^3.20.7", + "@react-stately/tree": "^3.9.4", + "@react-types/button": "^3.14.1", + "@react-types/menu": "^3.10.5", + "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/numberfield": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.12.2.tgz", - "integrity": "sha512-M2b+z0HIXiXpGAWOQkO2kpIjaLNUXJ5Q3/GMa3Fkr+B1piFX0VuOynYrtddKVrmXCe+r5t+XcGb0KS29uqv7nQ==", + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@react-aria/numberfield/-/numberfield-3.12.3.tgz", + "integrity": "sha512-70LRXWPEuj2X8mbQXUx6l6We+RGs49Kb+2eUiSSLArHK4RvTWJWEfSjHL5IHHJ+j2AkbORdryD7SR3gcXSX+5w==", "license": "Apache-2.0", "dependencies": { - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/spinbutton": "^3.6.19", - "@react-aria/textfield": "^3.18.2", - "@react-aria/utils": "^3.31.0", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/spinbutton": "^3.7.0", + "@react-aria/textfield": "^3.18.3", + "@react-aria/utils": "^3.32.0", "@react-stately/form": "^3.2.2", - "@react-stately/numberfield": "^3.10.2", + "@react-stately/numberfield": "^3.10.3", "@react-types/button": "^3.14.1", - "@react-types/numberfield": "^3.8.15", + "@react-types/numberfield": "^3.8.16", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5079,18 +4408,18 @@ } }, "node_modules/@react-aria/overlays": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.30.0.tgz", - "integrity": "sha512-UpjqSjYZx5FAhceWCRVsW6fX1sEwya1fQ/TKkL53FAlLFR8QKuoKqFlmiL43YUFTcGK3UdEOy3cWTleLQwdSmQ==", + "version": "3.31.0", + "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.31.0.tgz", + "integrity": "sha512-Vq41X1s8XheGIhGbbuqRJslJEX08qmMVX//dwuBaFX9T18mMR04tumKOMxp8Lz+vqwdGLvjNUYDMcgolL+AMjw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.31.0", - "@react-aria/visually-hidden": "^3.8.28", - "@react-stately/overlays": "^3.6.20", + "@react-aria/utils": "^3.32.0", + "@react-aria/visually-hidden": "^3.8.29", + "@react-stately/overlays": "^3.6.21", "@react-types/button": "^3.14.1", "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1", @@ -5102,14 +4431,14 @@ } }, "node_modules/@react-aria/progress": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.27.tgz", - "integrity": "sha512-0OA1shs1575g1zmO8+rWozdbTnxThFFhOfuoL1m7UV5Dley6FHpueoKB1ECv7B+Qm4dQt6DoEqLg7wsbbQDhmg==", + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/@react-aria/progress/-/progress-3.4.28.tgz", + "integrity": "sha512-3NUUAu+rwf1M7pau9WFkrxe/PlBPiqCl/1maGU7iufVveHnz+SVVqXdNkjYx+WkPE0ViwG86Zx6OU4AYJ1pjNw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/i18n": "^3.12.13", - "@react-aria/label": "^3.7.22", - "@react-aria/utils": "^3.31.0", + "@react-aria/i18n": "^3.12.14", + "@react-aria/label": "^3.7.23", + "@react-aria/utils": "^3.32.0", "@react-types/progress": "^3.5.16", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5120,18 +4449,18 @@ } }, "node_modules/@react-aria/radio": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.12.2.tgz", - "integrity": "sha512-I11f6I90neCh56rT/6ieAs3XyDKvEfbj/QmbU5cX3p+SJpRRPN0vxQi5D1hkh0uxDpeClxygSr31NmZsd4sqfg==", + "version": "3.12.3", + "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.12.3.tgz", + "integrity": "sha512-noucVX++9J3VYWg7dB+r09NVX8UZSR1TWUMCbT/MffzhltOsmiLJVvgJ0uEeeVRuu3+ZM63jOshrzG89anX4TQ==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/form": "^3.1.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/utils": "^3.31.0", - "@react-stately/radio": "^3.11.2", + "@react-aria/focus": "^3.21.3", + "@react-aria/form": "^3.1.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/label": "^3.7.23", + "@react-aria/utils": "^3.32.0", + "@react-stately/radio": "^3.11.3", "@react-types/radio": "^3.9.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5142,16 +4471,16 @@ } }, "node_modules/@react-aria/selection": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.26.0.tgz", - "integrity": "sha512-ZBH3EfWZ+RfhTj01dH8L17uT7iNbXWS8u77/fUpHgtrm0pwNVhx0TYVnLU1YpazQ/3WVpvWhmBB8sWwD1FlD/g==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@react-aria/selection/-/selection-3.27.0.tgz", + "integrity": "sha512-4zgreuCu4QM4t2U7aF3mbMvIKCEkTEo6h6nGJvbyZALZ/eFtLTvUiV8/5CGDJRLGvgMvi3XxUeF9PZbpk5nMJg==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", - "@react-stately/selection": "^3.20.6", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/selection": "^3.20.7", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5161,16 +4490,16 @@ } }, "node_modules/@react-aria/slider": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.8.2.tgz", - "integrity": "sha512-6KyUGaVzRE4xAz1LKHbNh1q5wzxe58pdTHFSnxNe6nk1SCoHw7NfI4h2s2m6LgJ0megFxsT0Ir8aHaFyyxmbgg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@react-aria/slider/-/slider-3.8.3.tgz", + "integrity": "sha512-tOZVH+wLt3ik0C3wyuXqHL9fvnQ5S+/tHMYB7z8aZV5cEe36Gt4efBILphlA7ChkL/RvpHGK2AGpEGxvuEQIuQ==", "license": "Apache-2.0", "dependencies": { - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/label": "^3.7.22", - "@react-aria/utils": "^3.31.0", - "@react-stately/slider": "^3.7.2", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/label": "^3.7.23", + "@react-aria/utils": "^3.32.0", + "@react-stately/slider": "^3.7.3", "@react-types/shared": "^3.32.1", "@react-types/slider": "^3.8.2", "@swc/helpers": "^0.5.0" @@ -5198,65 +4527,6 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/spinbutton/node_modules/@internationalized/date": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.10.1.tgz", - "integrity": "sha512-oJrXtQiAXLvT9clCf1K4kxp3eKsQhIaZqxEyowkBcsvZDdZkbWrVmnGknxs5flTD0VGsxrxKgBCZty1EzoiMzA==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@react-aria/spinbutton/node_modules/@react-aria/i18n": { - "version": "3.12.14", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.14.tgz", - "integrity": "sha512-zYvs1FlLamFD49uneX3i5mPHrAsB3OjVpSWApTcPw8ydxOaphQDp/Q1aqrbcxlrQCcxZdXWHuvLlbkNR4+8jzw==", - "license": "Apache-2.0", - "dependencies": { - "@internationalized/date": "^3.10.1", - "@internationalized/message": "^3.1.8", - "@internationalized/number": "^3.6.5", - "@internationalized/string": "^3.2.7", - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/spinbutton/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/spinbutton/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/ssr": { "version": "3.9.10", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", @@ -5273,13 +4543,13 @@ } }, "node_modules/@react-aria/switch": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.7.8.tgz", - "integrity": "sha512-AfsUq1/YiuoprhcBUD9vDPyWaigAwctQNW1fMb8dROL+i/12B+Zekj8Ml+jbU69/kIVtfL0Jl7/0Bo9KK3X0xQ==", + "version": "3.7.9", + "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.7.9.tgz", + "integrity": "sha512-RZtuFRXews0PBx8Fc2R/kqaIARD5YIM5uYtmwnWfY7y5bEsBGONxp0d+m2vDyY7yk+VNpVFBdwewY9GbZmH1CA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/toggle": "^3.12.2", - "@react-stately/toggle": "^3.9.2", + "@react-aria/toggle": "^3.12.3", + "@react-stately/toggle": "^3.9.3", "@react-types/shared": "^3.32.1", "@react-types/switch": "^3.5.15", "@swc/helpers": "^0.5.0" @@ -5290,21 +4560,21 @@ } }, "node_modules/@react-aria/table": { - "version": "3.17.8", - "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.17.8.tgz", - "integrity": "sha512-bXiZoxTMbsqUJsYDhHPzKc3jw0HFJ/xMsJ49a0f7mp5r9zACxNLeIU0wJ4Uvx37dnYOHKzGliG+rj5l4sph7MA==", + "version": "3.17.9", + "resolved": "https://registry.npmjs.org/@react-aria/table/-/table-3.17.9.tgz", + "integrity": "sha512-Jby561E1YfzoRgtp+RQuhDz4vnxlcqol9RTgQQ7FWXC2IcN9Pny1COU34LkA1cL9VeB9LJ0+qfMhGw4aAwaUmw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/grid": "^3.14.5", - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", + "@react-aria/focus": "^3.21.3", + "@react-aria/grid": "^3.14.6", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", "@react-aria/live-announcer": "^3.4.4", - "@react-aria/utils": "^3.31.0", - "@react-aria/visually-hidden": "^3.8.28", + "@react-aria/utils": "^3.32.0", + "@react-aria/visually-hidden": "^3.8.29", "@react-stately/collections": "^3.12.8", "@react-stately/flags": "^3.1.2", - "@react-stately/table": "^3.15.1", + "@react-stately/table": "^3.15.2", "@react-types/checkbox": "^3.10.2", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", @@ -5317,18 +4587,18 @@ } }, "node_modules/@react-aria/tabs": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.10.8.tgz", - "integrity": "sha512-sPPJyTyoAqsBh76JinBAxStOcbjZvyWFYKpJ9Uqw+XT0ObshAPPFSGeh8DiQemPs02RwJdrfARPMhyqiX8t59A==", + "version": "3.10.9", + "resolved": "https://registry.npmjs.org/@react-aria/tabs/-/tabs-3.10.9.tgz", + "integrity": "sha512-2+FNd7Ohr3hrEgYrKdZW0FWbgybzTVZft6tw95oQ2+9PnjdDVdtzHliI+8HY8jzb4hTf4bU7O8n+s/HBlCBSIw==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/selection": "^3.26.0", - "@react-aria/utils": "^3.31.0", - "@react-stately/tabs": "^3.8.6", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/selection": "^3.27.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/tabs": "^3.8.7", "@react-types/shared": "^3.32.1", - "@react-types/tabs": "^3.3.19", + "@react-types/tabs": "^3.3.20", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -5357,63 +4627,16 @@ "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-aria/textfield/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/textfield/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/textfield/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-aria/toast": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@react-aria/toast/-/toast-3.0.8.tgz", - "integrity": "sha512-rfJIms6AkMyQ7ZgKrMZgGfPwGcB/t1JoEwbc1PAmXcAvFI/hzF6YF7ZFDXiq38ucFsP9PnHmbXIzM9w4ccl18A==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@react-aria/toast/-/toast-3.0.9.tgz", + "integrity": "sha512-2sRitczXl5VEwyq97o8TVvq3bIqLA7EfA7dhDPkYlHGa4T1vzKkhNqgkskKd9+Tw7gqeFRFjnokh+es9jkM11g==", "license": "Apache-2.0", "dependencies": { - "@react-aria/i18n": "^3.12.13", - "@react-aria/interactions": "^3.25.6", - "@react-aria/landmark": "^3.0.7", - "@react-aria/utils": "^3.31.0", + "@react-aria/i18n": "^3.12.14", + "@react-aria/interactions": "^3.26.0", + "@react-aria/landmark": "^3.0.8", + "@react-aria/utils": "^3.32.0", "@react-stately/toast": "^3.1.2", "@react-types/button": "^3.14.1", "@react-types/shared": "^3.32.1", @@ -5430,89 +4653,27 @@ "integrity": "sha512-mciUbeVP99fRObnH5qLFrkKXX+5VKeV6BhFJlmz1eo3ltR/0xZKnUcycA2CGzmqtB70w09CAhr8NMEnpNH8dwQ==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.26.0", - "@react-aria/utils": "^3.32.0", - "@react-stately/toggle": "^3.9.3", - "@react-types/checkbox": "^3.10.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/toggle/node_modules/@react-aria/interactions": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.26.0.tgz", - "integrity": "sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-aria/utils": "^3.32.0", - "@react-stately/flags": "^3.1.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/toggle/node_modules/@react-aria/utils": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", - "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", - "license": "Apache-2.0", - "dependencies": { - "@react-aria/ssr": "^3.9.10", - "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.11.0", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0", - "clsx": "^2.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", - "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/toggle/node_modules/@react-stately/toggle": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.9.3.tgz", - "integrity": "sha512-G6aA/aTnid/6dQ9dxNEd7/JqzRmVkVYYpOAP+l02hepiuSmFwLu4nE98i4YFBQqFZ5b4l01gMrS90JGL7HrNmw==", - "license": "Apache-2.0", - "dependencies": { - "@react-stately/utils": "^3.11.0", - "@react-types/checkbox": "^3.10.2", - "@react-types/shared": "^3.32.1", - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, - "node_modules/@react-aria/toggle/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { + "@react-aria/interactions": "^3.26.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/toggle": "^3.9.3", + "@react-types/checkbox": "^3.10.2", + "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, "node_modules/@react-aria/toolbar": { - "version": "3.0.0-beta.21", - "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.21.tgz", - "integrity": "sha512-yRCk/GD8g+BhdDgxd3I0a0c8Ni4Wyo6ERzfSoBkPkwQ4X2E2nkopmraM9D0fXw4UcIr4bnmvADzkHXtBN0XrBg==", + "version": "3.0.0-beta.22", + "resolved": "https://registry.npmjs.org/@react-aria/toolbar/-/toolbar-3.0.0-beta.22.tgz", + "integrity": "sha512-Q1gOj6N4vzvpGrIoNAxpUudEQP82UgQACENH/bcH8FnEMbSP7DHvVfDhj7GTU6ldMXO2cjqLhiidoUK53gkCiA==", "license": "Apache-2.0", "dependencies": { - "@react-aria/focus": "^3.21.2", - "@react-aria/i18n": "^3.12.13", - "@react-aria/utils": "^3.31.0", + "@react-aria/focus": "^3.21.3", + "@react-aria/i18n": "^3.12.14", + "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5522,16 +4683,16 @@ } }, "node_modules/@react-aria/tooltip": { - "version": "3.8.8", - "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.8.8.tgz", - "integrity": "sha512-CmHUqtXtFWmG4AHMEr9hIVex+oscK6xcM2V47gq9ijNInxe3M6UBu/dBdkgGP/jYv9N7tzCAjTR8nNIHQXwvWw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@react-aria/tooltip/-/tooltip-3.9.0.tgz", + "integrity": "sha512-2O1DXEV8/+DeUq9dIlAfaNa7lSG+7FCZDuF+sNiPYnZM6tgFOrsId26uMF5EuwpVfOvXSSGnq0+6Ma2On7mZPg==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", - "@react-stately/tooltip": "^3.5.8", + "@react-aria/interactions": "^3.26.0", + "@react-aria/utils": "^3.32.0", + "@react-stately/tooltip": "^3.5.9", "@react-types/shared": "^3.32.1", - "@react-types/tooltip": "^3.4.21", + "@react-types/tooltip": "^3.5.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -5540,14 +4701,14 @@ } }, "node_modules/@react-aria/utils": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.31.0.tgz", - "integrity": "sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.32.0.tgz", + "integrity": "sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==", "license": "Apache-2.0", "dependencies": { "@react-aria/ssr": "^3.9.10", "@react-stately/flags": "^3.1.2", - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" @@ -5558,13 +4719,13 @@ } }, "node_modules/@react-aria/visually-hidden": { - "version": "3.8.28", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.28.tgz", - "integrity": "sha512-KRRjbVVob2CeBidF24dzufMxBveEUtUu7IM+hpdZKB+gxVROoh4XRLPv9SFmaH89Z7D9To3QoykVZoWD0lan6Q==", + "version": "3.8.29", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.29.tgz", + "integrity": "sha512-1joCP+MHBLd+YA6Gb08nMFfDBhOF0Kh1gR1SA8zoxEB5RMfQEEkufIB8k0GGwvHGSCK3gFyO8UAVsD0+rRYEyg==", "license": "Apache-2.0", "dependencies": { - "@react-aria/interactions": "^3.25.6", - "@react-aria/utils": "^3.31.0", + "@react-aria/interactions": "^3.26.0", + "@react-aria/utils": "^3.32.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5592,14 +4753,14 @@ "license": "MIT" }, "node_modules/@react-stately/calendar": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.0.tgz", - "integrity": "sha512-U5Nf2kx9gDhJRxdDUm5gjfyUlt/uUfOvM1vDW2UA62cA6+2k2cavMLc2wNlXOb/twFtl6p0joYKHG7T4xnEFkg==", + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@react-stately/calendar/-/calendar-3.9.1.tgz", + "integrity": "sha512-q0Q8fivpQa1rcLg5daUVxwVj1smCp1VnpX9A5Q5PkI9lH9x+xdS0Y6eOqb8Ih3TKBDkx9/oEZonOX7RYNIzSig==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", - "@react-stately/utils": "^3.10.8", - "@react-types/calendar": "^3.8.0", + "@internationalized/date": "^3.10.1", + "@react-stately/utils": "^3.11.0", + "@react-types/calendar": "^3.8.1", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5608,13 +4769,13 @@ } }, "node_modules/@react-stately/checkbox": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.7.2.tgz", - "integrity": "sha512-j1ycUVz5JmqhaL6mDZgDNZqBilOB8PBW096sDPFaTtuYreDx2HOd1igxiIvwlvPESZwsJP7FVM3mYnaoXtpKPA==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-stately/checkbox/-/checkbox-3.7.3.tgz", + "integrity": "sha512-ve2K+uWT+NRM1JMn+tkWJDP2iBAaWvbZ0TbSXs371IUcTWaNW61HygZ+UFOB/frAZGloazEKGqAsX5XjFpgB9w==", "license": "Apache-2.0", "dependencies": { "@react-stately/form": "^3.2.2", - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5637,17 +4798,17 @@ } }, "node_modules/@react-stately/combobox": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.12.0.tgz", - "integrity": "sha512-A6q9R/7cEa/qoQsBkdslXWvD7ztNLLQ9AhBhVN9QvzrmrH5B4ymUwcTU8lWl22ykH7RRwfonLeLXJL4C+/L2oQ==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/@react-stately/combobox/-/combobox-3.12.1.tgz", + "integrity": "sha512-RwfTTYgKJ9raIY+7grZ5DbfVRSO5pDjo/ur2VN/28LZzM0eOQrLFQ00vpBmY7/R64sHRpcXLDxpz5cqpKCdvTw==", "license": "Apache-2.0", "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/form": "^3.2.2", - "@react-stately/list": "^3.13.1", - "@react-stately/overlays": "^3.6.20", - "@react-stately/utils": "^3.10.8", - "@react-types/combobox": "^3.13.9", + "@react-stately/list": "^3.13.2", + "@react-stately/overlays": "^3.6.21", + "@react-stately/utils": "^3.11.0", + "@react-types/combobox": "^3.13.10", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5656,17 +4817,17 @@ } }, "node_modules/@react-stately/datepicker": { - "version": "3.15.2", - "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.15.2.tgz", - "integrity": "sha512-S5GL+W37chvV8knv9v0JRv0L6hKo732qqabCCHXzOpYxkLIkV4f/y3cHdEzFWzpZ0O0Gkg7WgeYo160xOdBKYg==", + "version": "3.15.3", + "resolved": "https://registry.npmjs.org/@react-stately/datepicker/-/datepicker-3.15.3.tgz", + "integrity": "sha512-RDYoz1R/EkCyxHYewb58T7DngU3gl6CnQL7xiWiDlayPnstGaanoQ3yCZGJaIQwR8PrKdNbQwXF9NlSmj8iCOw==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", + "@internationalized/date": "^3.10.1", "@internationalized/string": "^3.2.7", "@react-stately/form": "^3.2.2", - "@react-stately/overlays": "^3.6.20", - "@react-stately/utils": "^3.10.8", - "@react-types/datepicker": "^3.13.2", + "@react-stately/overlays": "^3.6.21", + "@react-stately/utils": "^3.11.0", + "@react-types/datepicker": "^3.13.3", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5713,14 +4874,14 @@ } }, "node_modules/@react-stately/list": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.13.1.tgz", - "integrity": "sha512-eHaoauh21twbcl0kkwULhVJ+CzYcy1jUjMikNVMHOQdhr4WIBdExf7PmSgKHKqsSPhpGg6IpTCY2dUX3RycjDg==", + "version": "3.13.2", + "resolved": "https://registry.npmjs.org/@react-stately/list/-/list-3.13.2.tgz", + "integrity": "sha512-dGFALuQWNNOkv7W12qSsXLF4mJHLeWeK2hVvdyj4SI8Vxku+BOfaVKuW3sn3mNiixI1dM/7FY2ip4kK+kv27vw==", "license": "Apache-2.0", "dependencies": { "@react-stately/collections": "^3.12.8", - "@react-stately/selection": "^3.20.6", - "@react-stately/utils": "^3.10.8", + "@react-stately/selection": "^3.20.7", + "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5729,12 +4890,12 @@ } }, "node_modules/@react-stately/menu": { - "version": "3.9.8", - "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.8.tgz", - "integrity": "sha512-bo0NOhofnTHLESiYfsSSw6gyXiPVJJ0UlN2igUXtJk5PmyhWjFzUzTzcnd7B028OB0si9w3LIWM3stqz5271Eg==", + "version": "3.9.9", + "resolved": "https://registry.npmjs.org/@react-stately/menu/-/menu-3.9.9.tgz", + "integrity": "sha512-moW5JANxMxPilfR0SygpCWCZe7Ef09oadgzTZthRymNRv0PXVS9ad4wd1EkwuMvPH/n0uZLZE2s8hNyFDgyqPA==", "license": "Apache-2.0", "dependencies": { - "@react-stately/overlays": "^3.6.20", + "@react-stately/overlays": "^3.6.21", "@react-types/menu": "^3.10.5", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5744,15 +4905,15 @@ } }, "node_modules/@react-stately/numberfield": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.10.2.tgz", - "integrity": "sha512-jlKVFYaH3RX5KvQ7a+SAMQuPccZCzxLkeYkBE64u1Zvi7YhJ8hkTMHG/fmZMbk1rHlseE2wfBdk0Rlya3MvoNQ==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-stately/numberfield/-/numberfield-3.10.3.tgz", + "integrity": "sha512-40g/oyVcWoEaLqkr61KuHZzQVLLXFi3oa2K8XLnb6o+859SM4TX3XPNqL6eNQjXSKoJO5Hlgpqhee9j+VDbGog==", "license": "Apache-2.0", "dependencies": { "@internationalized/number": "^3.6.5", "@react-stately/form": "^3.2.2", - "@react-stately/utils": "^3.10.8", - "@react-types/numberfield": "^3.8.15", + "@react-stately/utils": "^3.11.0", + "@react-types/numberfield": "^3.8.16", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -5760,12 +4921,12 @@ } }, "node_modules/@react-stately/overlays": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.20.tgz", - "integrity": "sha512-YAIe+uI8GUXX8F/0Pzr53YeC5c/bjqbzDFlV8NKfdlCPa6+Jp4B/IlYVjIooBj9+94QvbQdjylegvYWK/iPwlg==", + "version": "3.6.21", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.21.tgz", + "integrity": "sha512-7f25H1PS2g+SNvuWPEW30pSGqYNHxesCP4w+1RcV/XV1oQI7oP5Ji2WfI0QsJEFc9wP/ZO1pyjHNKpfLI3O88g==", "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/overlays": "^3.9.2", "@swc/helpers": "^0.5.0" }, @@ -5774,13 +4935,13 @@ } }, "node_modules/@react-stately/radio": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.11.2.tgz", - "integrity": "sha512-UM7L6AW+k8edhSBUEPZAqiWNRNadfOKK7BrCXyBiG79zTz0zPcXRR+N+gzkDn7EMSawDeyK1SHYUuoSltTactg==", + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.11.3.tgz", + "integrity": "sha512-8+Cy0azV1aBWKcBfGHi3nBa285lAS6XhmVw2LfEwxq8DeVKTbJAaCHHwvDoclxDiOAnqzE0pio0QMD8rYISt9g==", "license": "Apache-2.0", "dependencies": { "@react-stately/form": "^3.2.2", - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/radio": "^3.9.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5804,25 +4965,13 @@ "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" } }, - "node_modules/@react-stately/selection/node_modules/@react-stately/utils": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", - "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", - "license": "Apache-2.0", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" - } - }, "node_modules/@react-stately/slider": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.7.2.tgz", - "integrity": "sha512-EVBHUdUYwj++XqAEiQg2fGi8Reccznba0uyQ3gPejF0pAc390Q/J5aqiTEDfiCM7uJ6WHxTM6lcCqHQBISk2dQ==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@react-stately/slider/-/slider-3.7.3.tgz", + "integrity": "sha512-9QGnQNXFAH52BzxtU7weyOV/VV7/so6uIvE8VOHfc6QR3GMBM/kJvqBCTWZfQ0pxDIsRagBQDD/tjB09ixTOzg==", "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@react-types/slider": "^3.8.2", "@swc/helpers": "^0.5.0" @@ -5832,16 +4981,16 @@ } }, "node_modules/@react-stately/table": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.15.1.tgz", - "integrity": "sha512-MhMAgE/LgAzHcAn1P3p/nQErzJ6DiixSJ1AOt2JlnAKEb5YJg4ATKWCb2IjBLwywt9ZCzfm3KMUzkctZqAoxwA==", + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/@react-stately/table/-/table-3.15.2.tgz", + "integrity": "sha512-vgEArBN5ocqsQdeORBj6xk8acu5iFnd/CyXEQKl0R5RyuYuw0ms8UmFHvs8Fv1HONehPYg+XR4QPliDFPX8R9A==", "license": "Apache-2.0", "dependencies": { "@react-stately/collections": "^3.12.8", "@react-stately/flags": "^3.1.2", - "@react-stately/grid": "^3.11.6", - "@react-stately/selection": "^3.20.6", - "@react-stately/utils": "^3.10.8", + "@react-stately/grid": "^3.11.7", + "@react-stately/selection": "^3.20.7", + "@react-stately/utils": "^3.11.0", "@react-types/grid": "^3.3.6", "@react-types/shared": "^3.32.1", "@react-types/table": "^3.13.4", @@ -5852,14 +5001,14 @@ } }, "node_modules/@react-stately/tabs": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.8.6.tgz", - "integrity": "sha512-9RYxmgjVIxUpIsGKPIF7uRoHWOEz8muwaYiStCVeyiYBPmarvZoIYtTXcwSMN/vEs7heVN5uGCL6/bfdY4+WiA==", + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/@react-stately/tabs/-/tabs-3.8.7.tgz", + "integrity": "sha512-ETZEzg7s9F2SCvisZ2cCpLx6XBHqdvVgDGU5l3C3s9zBKBr6lgyLFt61IdGW8XXZRUvw4mMGT6tGQbXeGvR0Wg==", "license": "Apache-2.0", "dependencies": { - "@react-stately/list": "^3.13.1", + "@react-stately/list": "^3.13.2", "@react-types/shared": "^3.32.1", - "@react-types/tabs": "^3.3.19", + "@react-types/tabs": "^3.3.20", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -5880,12 +5029,12 @@ } }, "node_modules/@react-stately/toggle": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.9.2.tgz", - "integrity": "sha512-dOxs9wrVXHUmA7lc8l+N9NbTJMAaXcYsnNGsMwfXIXQ3rdq+IjWGNYJ52UmNQyRYFcg0jrzRrU16TyGbNjOdNQ==", + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.9.3.tgz", + "integrity": "sha512-G6aA/aTnid/6dQ9dxNEd7/JqzRmVkVYYpOAP+l02hepiuSmFwLu4nE98i4YFBQqFZ5b4l01gMrS90JGL7HrNmw==", "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.10.8", + "@react-stately/utils": "^3.11.0", "@react-types/checkbox": "^3.10.2", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" @@ -5895,13 +5044,13 @@ } }, "node_modules/@react-stately/tooltip": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.8.tgz", - "integrity": "sha512-gkcUx2ROhCiGNAYd2BaTejakXUUNLPnnoJ5+V/mN480pN+OrO8/2V9pqb/IQmpqxLsso93zkM3A4wFHHLBBmPQ==", + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/@react-stately/tooltip/-/tooltip-3.5.9.tgz", + "integrity": "sha512-YwqtxFqQFfJtbeh+axHVGAfz9XHf73UaBndHxSbVM/T5c1PfI2yOB39T2FOU5fskZ2VMO3qTDhiXmFgGbGYSfQ==", "license": "Apache-2.0", "dependencies": { - "@react-stately/overlays": "^3.6.20", - "@react-types/tooltip": "^3.4.21", + "@react-stately/overlays": "^3.6.21", + "@react-types/tooltip": "^3.5.0", "@swc/helpers": "^0.5.0" }, "peerDependencies": { @@ -5909,14 +5058,14 @@ } }, "node_modules/@react-stately/tree": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.9.3.tgz", - "integrity": "sha512-ZngG79nLFxE/GYmpwX6E/Rma2MMkzdoJPRI3iWk3dgqnGMMzpPnUp/cvjDsU3UHF7xDVusC5BT6pjWN0uxCIFQ==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/@react-stately/tree/-/tree-3.9.4.tgz", + "integrity": "sha512-Re1fdEiR0hHPcEda+7ecw+52lgGfFW0MAEDzFg9I6J/t8STQSP+1YC0VVVkv2xRrkLbKLPqggNKgmD8nggecnw==", "license": "Apache-2.0", "dependencies": { "@react-stately/collections": "^3.12.8", - "@react-stately/selection": "^3.20.6", - "@react-stately/utils": "^3.10.8", + "@react-stately/selection": "^3.20.7", + "@react-stately/utils": "^3.11.0", "@react-types/shared": "^3.32.1", "@swc/helpers": "^0.5.0" }, @@ -5925,9 +5074,9 @@ } }, "node_modules/@react-stately/utils": { - "version": "3.10.8", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.8.tgz", - "integrity": "sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", + "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" @@ -5988,12 +5137,12 @@ } }, "node_modules/@react-types/calendar": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.8.0.tgz", - "integrity": "sha512-ZDZgfZgbz1ydWOFs1mH7QFfX3ioJrmb3Y/lkoubQE0HWXLZzyYNvhhKyFJRS1QJ40IofLSBHriwbQb/tsUnGlw==", + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@react-types/calendar/-/calendar-3.8.1.tgz", + "integrity": "sha512-B0UuitMP7YkArBAQldwSZSNL2WwazNGCG+lp6yEDj831NrH9e36/jcjv1rObQ9ZMS6uDX9LXu5C8V5RFwGQabA==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", + "@internationalized/date": "^3.10.1", "@react-types/shared": "^3.32.1" }, "peerDependencies": { @@ -6013,9 +5162,9 @@ } }, "node_modules/@react-types/combobox": { - "version": "3.13.9", - "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.9.tgz", - "integrity": "sha512-G6GmLbzVkLW6VScxPAr/RtliEyPhBClfYaIllK1IZv+Z42SVnOpKzhnoe79BpmiFqy1AaC3+LjZX783mrsHCwA==", + "version": "3.13.10", + "resolved": "https://registry.npmjs.org/@react-types/combobox/-/combobox-3.13.10.tgz", + "integrity": "sha512-Wo4iix++ID6JzoH9eD7ddGUlirQiGpN/VQc3iFjnaTXiJ/cj3v+1oGsDGCZZTklTVeUMU7SRBfMhMgxHHIYLXA==", "license": "Apache-2.0", "dependencies": { "@react-types/shared": "^3.32.1" @@ -6025,13 +5174,13 @@ } }, "node_modules/@react-types/datepicker": { - "version": "3.13.2", - "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.13.2.tgz", - "integrity": "sha512-+M6UZxJnejYY8kz0spbY/hP08QJ5rsZ3aNarRQQHc48xV2oelFLX5MhAqizfLEsvyfb0JYrhWoh4z1xZtAmYCg==", + "version": "3.13.3", + "resolved": "https://registry.npmjs.org/@react-types/datepicker/-/datepicker-3.13.3.tgz", + "integrity": "sha512-OTRa3banGxcUQKRTLUzr0zTVUMUL+Az1BWARCYQ+8Z/dlkYXYUW0fnS5I0pUEqihgai15KxiY13U0gAqbNSfcA==", "license": "Apache-2.0", "dependencies": { - "@internationalized/date": "^3.10.0", - "@react-types/calendar": "^3.8.0", + "@internationalized/date": "^3.10.1", + "@react-types/calendar": "^3.8.1", "@react-types/overlays": "^3.9.2", "@react-types/shared": "^3.32.1" }, @@ -6114,9 +5263,9 @@ } }, "node_modules/@react-types/numberfield": { - "version": "3.8.15", - "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.15.tgz", - "integrity": "sha512-97r92D23GKCOjGIGMeW9nt+/KlfM3GeWH39Czcmd2/D5y3k6z4j0avbsfx2OttCtJszrnENjw3GraYGYI2KosQ==", + "version": "3.8.16", + "resolved": "https://registry.npmjs.org/@react-types/numberfield/-/numberfield-3.8.16.tgz", + "integrity": "sha512-945F0GsD7K2T293YXhap+2Runl3tZWbnhadXVHFWLbqIKKONZFSZTfLKxQcbFr+bQXr2uh1bVJhYcOiS1l5M+A==", "license": "Apache-2.0", "dependencies": { "@react-types/shared": "^3.32.1" @@ -6232,9 +5381,9 @@ } }, "node_modules/@react-types/tooltip": { - "version": "3.4.21", - "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.4.21.tgz", - "integrity": "sha512-ugGHOZU6WbOdeTdbjnaEc+Ms7/WhsUCg+T3PCOIeOT9FG02Ce189yJ/+hd7oqL/tVwIhEMYJIqSCgSELFox+QA==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@react-types/tooltip/-/tooltip-3.5.0.tgz", + "integrity": "sha512-o/m1wlKlOD2sLb9vZLWdVkD5LFLHBMLGeeK/bhyUtp0IEdUeKy0ZRTS7pa/A50trov9RvdbzLK79xG8nKNxHew==", "license": "Apache-2.0", "dependencies": { "@react-types/overlays": "^3.9.2", @@ -6258,9 +5407,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", - "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.56.0.tgz", + "integrity": "sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==", "cpu": [ "arm" ], @@ -6272,9 +5421,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", - "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.56.0.tgz", + "integrity": "sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==", "cpu": [ "arm64" ], @@ -6286,9 +5435,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", - "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.56.0.tgz", + "integrity": "sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==", "cpu": [ "arm64" ], @@ -6300,9 +5449,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", - "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.56.0.tgz", + "integrity": "sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==", "cpu": [ "x64" ], @@ -6314,9 +5463,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", - "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.56.0.tgz", + "integrity": "sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==", "cpu": [ "arm64" ], @@ -6328,9 +5477,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", - "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.56.0.tgz", + "integrity": "sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==", "cpu": [ "x64" ], @@ -6342,9 +5491,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", - "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.56.0.tgz", + "integrity": "sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==", "cpu": [ "arm" ], @@ -6356,9 +5505,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", - "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.56.0.tgz", + "integrity": "sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==", "cpu": [ "arm" ], @@ -6370,9 +5519,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", - "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.56.0.tgz", + "integrity": "sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==", "cpu": [ "arm64" ], @@ -6384,9 +5533,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", - "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.56.0.tgz", + "integrity": "sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==", "cpu": [ "arm64" ], @@ -6398,9 +5547,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", - "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.56.0.tgz", + "integrity": "sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.56.0.tgz", + "integrity": "sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==", "cpu": [ "loong64" ], @@ -6412,9 +5575,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", - "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.56.0.tgz", + "integrity": "sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.56.0.tgz", + "integrity": "sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==", "cpu": [ "ppc64" ], @@ -6426,9 +5603,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", - "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.56.0.tgz", + "integrity": "sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==", "cpu": [ "riscv64" ], @@ -6440,9 +5617,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", - "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.56.0.tgz", + "integrity": "sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==", "cpu": [ "riscv64" ], @@ -6454,9 +5631,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", - "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.56.0.tgz", + "integrity": "sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==", "cpu": [ "s390x" ], @@ -6468,9 +5645,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.56.0.tgz", + "integrity": "sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==", "cpu": [ "x64" ], @@ -6482,9 +5659,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", - "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.56.0.tgz", + "integrity": "sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==", "cpu": [ "x64" ], @@ -6495,10 +5672,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.56.0.tgz", + "integrity": "sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", - "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.56.0.tgz", + "integrity": "sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==", "cpu": [ "arm64" ], @@ -6510,9 +5701,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", - "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.56.0.tgz", + "integrity": "sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==", "cpu": [ "arm64" ], @@ -6524,9 +5715,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", - "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.56.0.tgz", + "integrity": "sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==", "cpu": [ "ia32" ], @@ -6538,9 +5729,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", - "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.56.0.tgz", + "integrity": "sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==", "cpu": [ "x64" ], @@ -6552,9 +5743,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", - "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz", + "integrity": "sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==", "cpu": [ "x64" ], @@ -6575,65 +5766,19 @@ "text-hex": "1.0.x" } }, - "node_modules/@so-ric/colorspace/node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "license": "MIT", - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@so-ric/colorspace/node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/@so-ric/colorspace/node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "license": "MIT", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/@so-ric/colorspace/node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "license": "MIT", - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/@swc/helpers": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", - "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.11.tgz", + "integrity": "sha512-h9wegbZDPurxG22xZSoWtdzc41/OlNEUQERNqI/0fOwa2aVlWGu7C35E/x6LDyD3lgtztFSSjKZyuVM0hxhbgA==", "dev": true, "license": "MIT", "dependencies": { @@ -6655,26 +5800,13 @@ "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, - "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@tanstack/react-virtual": { - "version": "3.13.13", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.13.tgz", - "integrity": "sha512-4o6oPMDvQv+9gMi8rE6gWmsOjtUZUYIJHv7EB+GblyYdi8U6OqLl8rhHWIUZSL1dUU2dPwTdTgybCKf9EjIrQg==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.18.tgz", + "integrity": "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.13.13" + "@tanstack/virtual-core": "3.13.18" }, "funding": { "type": "github", @@ -6686,9 +5818,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.13.13", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.13.tgz", - "integrity": "sha512-uQFoSdKKf5S8k51W5t7b2qpfkyIbdHMzAn+AMQvHPxKUPeo1SsGaA4JRISQT87jm28b7z8OEqPcg1IOZagQHcA==", + "version": "3.13.18", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.18.tgz", + "integrity": "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==", "license": "MIT", "funding": { "type": "github", @@ -6932,57 +6064,57 @@ } }, "node_modules/@tauri-apps/plugin-shell": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.3.tgz", - "integrity": "sha512-Xod+pRcFxmOWFWEnqH5yZcA7qwAMuaaDkMR1Sply+F8VfBj++CGnj2xf5UoialmjZ2Cvd8qrvSCbU+7GgNVsKQ==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.4.tgz", + "integrity": "sha512-ktsRWf8wHLD17aZEyqE8c5x98eNAuTizR1FSX475zQ4TxaiJnhwksLygQz+AGwckJL5bfEP13nWrlTNQJUpKpA==", "license": "MIT OR Apache-2.0", "dependencies": { "@tauri-apps/api": "^2.8.0" } }, "node_modules/@tiptap/core": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.14.0.tgz", - "integrity": "sha512-nm0VWVA1Vq/jaKY3wyRXViL/kf78yMdH7qETpv4qZXDQLU+pdWV3IGoRTQTKESc7d8L1wL/2uCeByLNUJfrSIw==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.18.0.tgz", + "integrity": "sha512-Gczd4GbK1DNgy/QUPElMVozoa0GW9mW8E31VIi7Q4a9PHHz8PcrxPmuWwtJ2q0PF8MWpOSLuBXoQTWaXZRPRnQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/pm": "^3.14.0" + "@tiptap/pm": "^3.18.0" } }, "node_modules/@tiptap/extension-blockquote": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.14.0.tgz", - "integrity": "sha512-I7aOqcVLHBgCeRtMaMHA+ILSS8Sli46fjFq8477stOpQ79TPiBd6e4SDuFCAu58M94mVLMvlPKF2Eh5IvbIMyQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.17.1.tgz", + "integrity": "sha512-X4jU/fllJQ8QbjCHUafU4QIHBobyXP3yGBoOcXxUaKlWbLvUs0SQTREM3n6/86m2YyAxwTPG1cn3Xypf42DMAQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-bold": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.14.0.tgz", - "integrity": "sha512-T4ma6VLoHm9JupglidD3CfZXm89A3HMv99gLplXNizvy1mlr4R3uC3aBqKw6lAP+NoqCqbIgjwc4YYsqZClNwA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.17.1.tgz", + "integrity": "sha512-PZmrljcVBziJkQDXT/QJv4ESxVVQ0iRH+ruTzPda56Kk4h2310cSXGjI33W7rlCikGPoBAAjY/inujm46YB4bw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.14.0.tgz", - "integrity": "sha512-nraHy+5jumT67J7hWrCuVwVTS2vNj4FpV5kO8epVySBmgEBr/7Pyi4w7mQA1VRVOMdjeN9iypbgQ2rKhpfaoTw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.17.1.tgz", + "integrity": "sha512-z3E8biLiWlzZJwNHnB6j/ZyBdFrJmpl1lqKHc72JqahUHZvidZHdCOYssvR3fc6IaI7MXV13XY1DXUdFbatnaw==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0" @@ -6992,97 +6124,80 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.14.0.tgz", - "integrity": "sha512-luqPX4u52hiOAHJ95mYsNE+x+9dZxsM461Xny9d/eTXLjAcnwS7MghjrnpljvyYsSXNiwQtxUyEr4uEZZJ5gIQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.17.1.tgz", + "integrity": "sha512-2zw17XHruOJQK7ntLVq0PmOLajFhvQ+U4/qTfJnV3VOsHkm+2GPAksFe7I7+X0XmSmDru0pcT339Yywx/6Aykw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-code": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.14.0.tgz", - "integrity": "sha512-Sx9yLorzS+oqNmXID4jt0G5tDnsEgU0HtEXPLD3KNt/ltVxWJU0AXwCsp1/Dg0HIDL868vWpJ2jC1t/4oaf9kA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.17.1.tgz", + "integrity": "sha512-4W0x1ZZqSnIVzQV0/b5VR0bktef2HykH5I/Czzir9yqoZ5zV2cLrMVuLvdFNgRIckU60tQLmHrfKWLF50OY0ew==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-code-block": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.14.0.tgz", - "integrity": "sha512-hRSdIhhm3Q9JBMQdKaifRVFnAa4sG+M7l1QcTKR3VSYVy2/oR0U+aiOifi5OvMRBUwhaR71Ro+cMT9FH9s26Kg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" - } - }, - "node_modules/@tiptap/extension-code-block-lowlight": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-3.14.0.tgz", - "integrity": "sha512-vkiDvPZUadrjAGNzvJYYXl5R+U1XmGALSbm+VlrGCR7iXHgYaMHdkqxHwGZMSqtsF2szPEqcAzLZShlAKl+AkA==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.18.0.tgz", + "integrity": "sha512-fCx1oT95ikGfoizw+XCjeglQxlLK4lWgUcB4Dcn5TdaCoFBQMEaZs7Q0jVajxxxULnyArkg60uarc1ac/IF2Hw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/extension-code-block": "^3.14.0", - "@tiptap/pm": "^3.14.0", - "highlight.js": "^11", - "lowlight": "^2 || ^3" + "@tiptap/core": "^3.18.0", + "@tiptap/pm": "^3.18.0" } }, "node_modules/@tiptap/extension-document": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.14.0.tgz", - "integrity": "sha512-O3D7/GPB3XrWGy0y/b4LMHiY0eTd+dyIbSdiFtmUnbC/E9lqQLw43GiqvD9Gm6AyKhBA+Z45dKMbaOe1c6eTwQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.17.1.tgz", + "integrity": "sha512-F7Q5HoAU383HWFa6AXZQ5N6t6lTJzVjYM8z93XrtH/2GzDFwy1UmDSrsXqvgznedBLAOgCNVTNh9PjXpLoOUbg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.14.0.tgz", - "integrity": "sha512-IwHyiZKLjV9WSBlQFS+afMjucIML8wFAKkG8UKCu+CVOe/Qd1ImDGyv6rzPlCmefJkDHIUWS+c2STapJlUD1VQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.17.1.tgz", + "integrity": "sha512-EKJYPb7OSk3p9mX1SmHt4ccw89w1P1d55hC8aPtZJ6jxAUd5MSuVwvEEVz7LGldUZD9HZz9WFQ0Sv9U73Bpkmw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "^3.14.0" + "@tiptap/extensions": "^3.17.1" } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.14.0.tgz", - "integrity": "sha512-+ErwDF74NzX4JV0nXMSIUT9V8FDdo85r0SaBZ8lb2NLmElaA3LDklcNV7SsoKlRcwsAXtFkqQbDwXLNGQLYSPQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.17.1.tgz", + "integrity": "sha512-zYkoYsxp+cZ8tBDODm4E8hnSaMTdDWKJuCQWY2Ep14oMPkAkSJr8sCLL1tOnNSAnhGwLJQtRLkZ41nvUEP6xKA==", "license": "MIT", "funding": { "type": "github", @@ -7090,93 +6205,93 @@ }, "peerDependencies": { "@floating-ui/dom": "^1.0.0", - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.14.0.tgz", - "integrity": "sha512-hMg2U59+c9FreYtTvzxx5GWKejdZLRITMLEu4OTfrgQok6uF4qkzGEEqmYqPiHk08TBqAg18Y5bbpyqTsuit9A==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.17.1.tgz", + "integrity": "sha512-xItmJZTi+Z6UbLBhpBBL9RZDNbDXf+ntWVgblAmxtpyEyNh5k5tkM6IP9SJRhk92uVfnFpH9qkGo66a537I8QA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "^3.14.0" + "@tiptap/extensions": "^3.17.1" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.14.0.tgz", - "integrity": "sha512-XKxr8usQp+kFevhDK6Ccmnq1CIkLmPClhKwbt7AClGLKLBtEVAS1qUgcmKudkw8cD8Q2/69twI37LXa23sfuLA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.17.1.tgz", + "integrity": "sha512-28FZPUho1Q2AB3ka5SVEVib5f9dMKbE1kewLZeRIOQ5FuFNholGIPL5X1tKcwGW7G3A7Y0fGxeNmIZJ3hrqhzA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-heading": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.14.0.tgz", - "integrity": "sha512-4xpahSo3b1dN2nwA0XKXLQVz9nZ/vE443a/Y5QLWeXiu3v9wkcMs/5kQ5ysFeDZRBTfVUWBqhngI7zhvDUx2zQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.17.1.tgz", + "integrity": "sha512-rT+Su/YnHdlikg8f78t6RXlc1sVSfp7B0fdJdtFgS2e6BBYJQoDMp5L9nt54RR9Yy953aDW2sko7NArUCb8log==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.14.0.tgz", - "integrity": "sha512-65O4T9vPKLUKO1fLowh5jqtfQlH5eaIL7qb/uj5sXMMg8O7TCvBIRkwNuYsFTkJmTk4vBy+fjZ0uwSY3DFkO1g==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.17.1.tgz", + "integrity": "sha512-CHG6LBtxV+3qj5EcCRVlpvSW5udKD6KbnXIGhP+Tvy+OabLGzO4HNxz3+duDE0pMR4eKX1libsnqffj0vq7mnQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-image": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.14.0.tgz", - "integrity": "sha512-lmRU2bhKMDPo+00AiGXZu15jBA9Gmw6QixBWzRrUtsYuFrVAYYCUNIA6mDH7b80935ISqYI+YH1ZlJEmsMptJw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-image/-/extension-image-3.17.1.tgz", + "integrity": "sha512-VbSSZ//5qijm8F0lQQ6K+DGnZgjLKYQY2c+O56QNEoN8BaCFrJlsVgF1ttrSRUmoG4XBNIMlAS07kZXvMZQr0g==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-italic": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.14.0.tgz", - "integrity": "sha512-Arl5EaG4wdyipwvKjsI7Krlk3OkmqvLfF0YfGwsd5AVDxTiYuiDGgz7RF8J2kttbBeiUTqwME5xpkryQK3F+fg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.17.1.tgz", + "integrity": "sha512-unfRLmvf680Y0UkBToUcrDkSEKO/wAjd3nQ7CNPMfAc8m+ZMReXkcgLpeVvnDEiHNsJ0PlYSW7a45tnQD9HQdg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-link": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.14.0.tgz", - "integrity": "sha512-xaeJIktD42rJ4t9fbQpKe+yYNZ+YFIK96cp1Kdm0hZHv/8MPMNRiF85TRY+9U1aoyh5uRcspgCj7EKQb2Hs7qg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.17.1.tgz", + "integrity": "sha512-5kdN7vms5hMXtjiophUkgvzy8dNGvGSmol1Sawh30TEPrgXc93Ayj7YyGZlbimInKZcD8q+Od/FFc+wkrof3nA==", "license": "MIT", "dependencies": { "linkifyjs": "^4.3.2" @@ -7186,146 +6301,146 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-list": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.14.0.tgz", - "integrity": "sha512-rsjFH0Vd/4UbDsjwMLay7oz72VVu1r35t8ofAzy5587jn5JAjflaZs05XbRRMD2imUTK41dyajVSh8CqSnDEJw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.17.1.tgz", + "integrity": "sha512-LHKIxmXe5Me+vJZKhiwMBGHlApaBIAduNMRUpm5mkY7ER/m96zKR0VqrJd4LjVVH2iDvck5h1Ka4396MHWlKNg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-list-item": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.14.0.tgz", - "integrity": "sha512-19Dcp8HCFdhINmRy0KQLFfz9ZEuVwFWGAAjYG7BvMvkd9k4sJ5vCv5fej59G99rhsc+tCmik77w+SLksOcxwKQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.17.1.tgz", + "integrity": "sha512-Qjj4oIa44cTX0E6aw/4+wleqX21t5jMDxeSqP5uQ8Q3IdD1GoR5+yo+41XAHELaeZOXLHLkAIbzIxik3pOqO8w==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-list-keymap": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.14.0.tgz", - "integrity": "sha512-1oPbvNnQjeOxkHZcUbWPx/IY9o4fT3QGk/9A9cIjFrJRD2AHzbYfPDHNHINtg7Bj0jWz74cHvAHcaxP+M27jkA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.17.1.tgz", + "integrity": "sha512-zRidxbkJNe/j3nZpOGLnPeVdyciUM8MM+NHhxcjVKoNDA+/zEBfjXJ1dKC4UBsnSr4AS/3SCWBYHGXOoSqdUaA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.14.0.tgz", - "integrity": "sha512-/fXjVL4JajkJQoc213iiput0bCXC4ztUPUpvNuI62VcgFKHcTvX4eYxED1VflotCx0OdkyY9yYD8PtvyO5lkmA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.17.1.tgz", + "integrity": "sha512-pahAXbVajqX0Y51Zge9jKZlCtPV1oiq5Fbzs7gHF80KICIKf44i/AsUvfdJyT2N5/8kZrAMQHEiU/UgTMrhM3w==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.14.0.tgz", - "integrity": "sha512-NFxk2yNo3Cvh9g8evea+yTLNV48se7MbMcVizTnVhobqtBKv793qsb5FM5Hu30Y72FQPNfH+LRoap4XZyBPfVw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.17.1.tgz", + "integrity": "sha512-Vl+xAlINaPtX8XTPvPmeveYMEIMLs8gA7ItcKpyyo4cCzAfVCY3DKuWzOkQGUf7DKrhyJQZhpgLNMaq+h5sTSw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-placeholder": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.14.0.tgz", - "integrity": "sha512-sBiAs1gumdSZXO0ezMSmOkHnlzZNZ1fttm6GriAMIp5xfCvo/0LD6bHPXtvOAbT9ovLQX8mH5+iPZh2jKta7oQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.17.1.tgz", + "integrity": "sha512-cE8Rij5/1t4KnWE7GaDewhBek9DKNB+97yrxyggMegILg6v195hOmOkRZkyfnFMYZoBDlrfSAtX9wBvbZBqIsg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extensions": "^3.14.0" + "@tiptap/extensions": "^3.17.1" } }, "node_modules/@tiptap/extension-strike": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.14.0.tgz", - "integrity": "sha512-R8BbAhnWpisBml6okMKl98hY4tJjedTTgyTkx8tPabIJ92nS9IURKEk3foWB9uHxdTOBUqTvVT+2ScDf9r6QHg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.17.1.tgz", + "integrity": "sha512-c6fS6YIhxoU55etlJgM0Xqker+jn7I1KC7GVu6ljmda8I00K3/lOLZgvFUNPmgp8EJWtyTctj+3D3D+PaZaFAA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-table": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.14.0.tgz", - "integrity": "sha512-tt1OlzqlsRsTazARGpvwPJmKEu+jiMFuaueNM28V+AADtaIPyE160V6w2bkdeWQeaBWqZjOUGZaMjpsKqWXR+g==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-3.17.1.tgz", + "integrity": "sha512-FuAMdmM330tHJUYT5IV2ooFRqtXf+0D8llcE9nIQQCXKL4J0pfGSOIm40LVpunYgx2pV8SSCL51qTBuEmR84tQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-table-cell": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-3.14.0.tgz", - "integrity": "sha512-g8u0RfAill2F4DevffYHHeNHAfh3E3Kx/8fhRR6EdhQh5pj+mCuuJoTWB7kJjo6NuXCX7cBRRRB5XUmYu8KuTQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-3.17.1.tgz", + "integrity": "sha512-fezen+lLI3uMO/W0yZVRG3VjT9P0MIxf5XUn+WwWqoqFB1Ktuea/9swD8fS917NIMmBD/I1AzCqfoZNhPtZFxw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-table": "^3.14.0" + "@tiptap/extension-table": "^3.17.1" } }, "node_modules/@tiptap/extension-table-header": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-3.14.0.tgz", - "integrity": "sha512-dUGtXpfrXGhOvamuukcwhl2W5pEpeYlgNQIUEdR2aFmZeH86KDlHYQYCJ/hq74YLq2cPRla/WljNGut20tjWdw==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-3.17.1.tgz", + "integrity": "sha512-jgq5Qjml404IbF2s9DL5jW/r1p/kPxASZrvsfp3pVFfFym6Lw4oZAC9hOrd/6x3Mm4MCJAOcRTmybkwVHvqhjw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-table": "^3.14.0" + "@tiptap/extension-table": "^3.17.1" } }, "node_modules/@tiptap/extension-table-of-contents": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-of-contents/-/extension-table-of-contents-3.14.0.tgz", - "integrity": "sha512-m2zRVJzR073QjJiB1H2FVArtl6JeFXSD9ld3f4Bus6MLfRG8suAJEfBhYef+M2eei88vJNC9Cvk28x08Q8vhzA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-of-contents/-/extension-table-of-contents-3.17.1.tgz", + "integrity": "sha512-kfMt3YCAIMwwBbXnYoXYb/QqxId5pJyM1UEA9gH/+nqS65BfHfedrKoq4nvSfJIskZYdbUyJlWvvcpFC/Nmn8Q==", "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "uuid": "^10.0.0" @@ -7335,119 +6450,106 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" - } - }, - "node_modules/@tiptap/extension-table-of-contents/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/extension-table-row": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-3.14.0.tgz", - "integrity": "sha512-NBkN2Xqc7o+T/RrthD5q+EOmvXryQrR4+whagLe4HFYHwrI/DknkxhNvkdNJLdWxZKG0YKvU2D9Cgp/StOokjg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-3.17.1.tgz", + "integrity": "sha512-H3h6Z/1vV+DewIW0C8lG/DziGoGgs95YBd4EHji+Gyk/KCI30ybGOAypz+RwqtJsiKMzbjKUt/SJcFzseOfUtQ==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-table": "^3.14.0" + "@tiptap/extension-table": "^3.17.1" } }, "node_modules/@tiptap/extension-task-item": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.14.0.tgz", - "integrity": "sha512-hUUNrqqYffEJpPRRvPHidbvzAQgaHZ12c918MUqquWf/AfpmnTDYJplHpbh2gUbtg0nivNFgags7VJdnJeKlVQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-item/-/extension-task-item-3.17.1.tgz", + "integrity": "sha512-aKCOGNatRLo2m5Qlb2mRxhN7BUE9yNY+yXtLIi+mDH7IUnygffyuz9iCy+rNGihvZdQQKm9vU51dAjVMu5ww+g==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-task-list": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.14.0.tgz", - "integrity": "sha512-uFJkjxF8+yVewU/JR2PWgY2TGKqa0GntMPe/prozyIrKW6felcQ+Pypa6Mr3luk5e8C6GQB8Uh5+cVhLVTjZ/w==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-task-list/-/extension-task-list-3.17.1.tgz", + "integrity": "sha512-EiJjlfNioQub9G6SZ83b/1+5VhVtlHStQN7+BTIsA9EhRAeKwge0KtO1oMIzFkDryd9mki9GQx/D+eek2CNsYw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-list": "^3.14.0" + "@tiptap/extension-list": "^3.17.1" } }, "node_modules/@tiptap/extension-text": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.14.0.tgz", - "integrity": "sha512-XlpnD87LQ7lLcDcBenHgzxv3uivQzPdVHM16CY4lXR4aKDIp2mxjPZr4twHT+cOnRQHc8VYpRgkEo6LLX6VylA==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.17.1.tgz", + "integrity": "sha512-rGml96vokQbvPB+w6L3+WKyYJWwqELaLdFUr1WMgg+py5uNYGJYAExYNAbDb5biWJBrX9GgMlCaNeiJj849L1w==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-typography": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.14.0.tgz", - "integrity": "sha512-vqRP6muQI/o95bchhmdGDGFRnJkOVs8zAkzuL5FCc0GmwJAPKy+GHoRP9hfgYlawCqzi8exVDXiY6WkknN87Yg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-typography/-/extension-typography-3.17.1.tgz", + "integrity": "sha512-bEocTrK/gryk3VtthC9Ca03p2kutVIIFnDkVW6iOG8PgQWEspuQRgqE8yPnHxY8pBBDWxiaBzcGTSrp+3U9d5A==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extension-underline": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.14.0.tgz", - "integrity": "sha512-zmnWlsi2g/tMlThHby0Je9O+v24j4d+qcXF3nuzLUUaDsGCEtOyC9RzwITft59ViK+Nc2PD2W/J14rsB0j+qoQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.17.1.tgz", + "integrity": "sha512-6RdBzmkg6DYs0EqPyoqLGkISXzCnPqM/q3A6nh3EmFmORcIDfuNmcidvA6EImebK8KQGmtZKsRhQSnK4CNQ39g==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0" + "@tiptap/core": "^3.17.1" } }, "node_modules/@tiptap/extensions": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.14.0.tgz", - "integrity": "sha512-qQBVKqzU4ZVjRn8W0UbdfE4LaaIgcIWHOMrNnJ+PutrRzQ6ZzhmD/kRONvRWBfG9z3DU7pSKGwVYSR2hztsGuQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.17.1.tgz", + "integrity": "sha512-aQ4WA5bdRpv9yPQ6rRdiqwlMZ1eJw1HyEaNPQhOr2HVhQ0EqSDIOEXF4ymCveGAHxXbxNvtQ+4t1ymQEikGfXA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@tiptap/pm": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.14.0.tgz", - "integrity": "sha512-xrZmqI5jl4yMeAsu8p8gVP9S3An5h2MBi8BQHNnZmpyzkUrlpd40vlT6u13SWIqVi5ZWhBZ6U3rL7mkVLZuRKg==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.18.0.tgz", + "integrity": "sha512-8RoI5gW0xBVCsuxahpK8vx7onAw6k2/uR3hbGBBnH+HocDMaAZKot3nTyY546ij8ospIC1mnQ7k4BhVUZesZDQ==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.3.0", @@ -7475,9 +6577,9 @@ } }, "node_modules/@tiptap/react": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.14.0.tgz", - "integrity": "sha512-Eo/nLyKxHvnLIF4gI2WFhGJiVrqfA6XL9kismVG9NwBNF/NblMDmZZu6Z2SH/ONJQz2Egn7UBPNp3BMq/qZDcg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.17.1.tgz", + "integrity": "sha512-Hn/pIP3HG9xYnhI3iGrfVhgQhfIdOaEBSxOFzJ37patqSOlIoP5aZH/b2HZ4vgo5DdRlV56q7WtRC+vLIw4Neg==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.6", @@ -7489,12 +6591,12 @@ "url": "https://github.com/sponsors/ueberdosis" }, "optionalDependencies": { - "@tiptap/extension-bubble-menu": "^3.14.0", - "@tiptap/extension-floating-menu": "^3.14.0" + "@tiptap/extension-bubble-menu": "^3.17.1", + "@tiptap/extension-floating-menu": "^3.17.1" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0", + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", @@ -7502,35 +6604,35 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.14.0.tgz", - "integrity": "sha512-fHsC4oDVzvMU9btg+IUmu/eqPquapjJ341qaNI7cCeSCKjjE6XJEN6WcONLAVId2OZUwML0IX1Jgl+6gJxU9Jw==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/extension-blockquote": "^3.14.0", - "@tiptap/extension-bold": "^3.14.0", - "@tiptap/extension-bullet-list": "^3.14.0", - "@tiptap/extension-code": "^3.14.0", - "@tiptap/extension-code-block": "^3.14.0", - "@tiptap/extension-document": "^3.14.0", - "@tiptap/extension-dropcursor": "^3.14.0", - "@tiptap/extension-gapcursor": "^3.14.0", - "@tiptap/extension-hard-break": "^3.14.0", - "@tiptap/extension-heading": "^3.14.0", - "@tiptap/extension-horizontal-rule": "^3.14.0", - "@tiptap/extension-italic": "^3.14.0", - "@tiptap/extension-link": "^3.14.0", - "@tiptap/extension-list": "^3.14.0", - "@tiptap/extension-list-item": "^3.14.0", - "@tiptap/extension-list-keymap": "^3.14.0", - "@tiptap/extension-ordered-list": "^3.14.0", - "@tiptap/extension-paragraph": "^3.14.0", - "@tiptap/extension-strike": "^3.14.0", - "@tiptap/extension-text": "^3.14.0", - "@tiptap/extension-underline": "^3.14.0", - "@tiptap/extensions": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.17.1.tgz", + "integrity": "sha512-3vBGqag9mwuQoWTrfQlULtHeoFs7k/2Q8CREf3Y79hv2fqAXTvTOKlWYPSgZhiGVMp6Dti7BDiE9Y1QpvAat2g==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^3.17.1", + "@tiptap/extension-blockquote": "^3.17.1", + "@tiptap/extension-bold": "^3.17.1", + "@tiptap/extension-bullet-list": "^3.17.1", + "@tiptap/extension-code": "^3.17.1", + "@tiptap/extension-code-block": "^3.17.1", + "@tiptap/extension-document": "^3.17.1", + "@tiptap/extension-dropcursor": "^3.17.1", + "@tiptap/extension-gapcursor": "^3.17.1", + "@tiptap/extension-hard-break": "^3.17.1", + "@tiptap/extension-heading": "^3.17.1", + "@tiptap/extension-horizontal-rule": "^3.17.1", + "@tiptap/extension-italic": "^3.17.1", + "@tiptap/extension-link": "^3.17.1", + "@tiptap/extension-list": "^3.17.1", + "@tiptap/extension-list-item": "^3.17.1", + "@tiptap/extension-list-keymap": "^3.17.1", + "@tiptap/extension-ordered-list": "^3.17.1", + "@tiptap/extension-paragraph": "^3.17.1", + "@tiptap/extension-strike": "^3.17.1", + "@tiptap/extension-text": "^3.17.1", + "@tiptap/extension-underline": "^3.17.1", + "@tiptap/extensions": "^3.17.1", + "@tiptap/pm": "^3.17.1" }, "funding": { "type": "github", @@ -7538,17 +6640,17 @@ } }, "node_modules/@tiptap/suggestion": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.14.0.tgz", - "integrity": "sha512-B9BQ9Tck8HsISDc6jZmtaSpl8KK69JbKHfU0ntILxgj8aBASElewO+W8WE49JSTxuyJGRgnhGSgaGpM4LhbLAg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.17.1.tgz", + "integrity": "sha512-a188uVYjlLsUiwK3Ki7KsaWVWC0u28KsqGEAqCk9ECYmtVY99Hrb+rcAwGpMjA7tn8WAwThOxiLISoMdpuqXwg==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.14.0", - "@tiptap/pm": "^3.14.0" + "@tiptap/core": "^3.17.1", + "@tiptap/pm": "^3.17.1" } }, "node_modules/@types/babel__core": { @@ -7679,12 +6781,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.19.130", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", - "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "version": "25.0.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", + "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~7.16.0" } }, "node_modules/@types/node-fetch": { @@ -7698,9 +6800,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", - "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "version": "19.2.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz", + "integrity": "sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==", "license": "MIT", "peer": true, "dependencies": { @@ -7804,9 +6906,9 @@ } }, "node_modules/@zilliz/milvus2-sdk-node": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.6.5.tgz", - "integrity": "sha512-bHK2gNNpK2Oni4l+3+xbmHWFNpum5dUTSuxio9xG3zmV4mZMS7W5WGhhnjbCy1tYYhme5LGNDY1CGT/Q1ZtxQQ==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/@zilliz/milvus2-sdk-node/-/milvus2-sdk-node-2.6.9.tgz", + "integrity": "sha512-qOaVIpQ3E4w6Dp4lp9QIIuGedpE5dWRhK9SRX+y9WXcq4EXYvcdfR2aG/Vb5tWBPQwcMrGb5z8gRfFy7/gRbIw==", "license": "Apache-2.0", "dependencies": { "@grpc/grpc-js": "1.7.3", @@ -7984,9 +7086,9 @@ } }, "node_modules/apache-arrow/node_modules/@types/node": { - "version": "20.19.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", - "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "version": "20.19.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", + "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -8032,9 +7134,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.22", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", - "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "version": "10.4.23", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", + "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", "dev": true, "funding": [ { @@ -8052,10 +7154,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.27.0", - "caniuse-lite": "^1.0.30001754", + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", - "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -8111,9 +7212,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.5", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.5.tgz", - "integrity": "sha512-D5vIoztZOq1XM54LUdttJVc96ggEsIfju2JBvht06pSzpckp3C7HReun67Bghzrtdsq9XdMGbSSB3v3GhMNmAA==", + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", + "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8121,9 +7222,9 @@ } }, "node_modules/better-sqlite3": { - "version": "12.5.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.5.0.tgz", - "integrity": "sha512-WwCZ/5Diz7rsF29o27o0Gcc1Du+l7Zsv7SYtVPG0X3G/uUI1LqdxrQI7c9Hs2FWpqXXERjW9hp6g3/tH7DlVKg==", + "version": "12.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-12.6.2.tgz", + "integrity": "sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -8167,9 +7268,9 @@ } }, "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "license": "MIT", "dependencies": { "bytes": "^3.1.2", @@ -8178,7 +7279,7 @@ "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", - "qs": "^6.14.0", + "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" }, @@ -8329,9 +7430,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "dev": true, "funding": [ { @@ -8431,9 +7532,9 @@ } }, "node_modules/cheerio": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.2.tgz", - "integrity": "sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz", + "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", @@ -8441,11 +7542,11 @@ "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", - "htmlparser2": "^10.0.0", + "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", - "undici": "^7.12.0", + "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" }, "engines": { @@ -8538,16 +7639,16 @@ } }, "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "color-convert": "^3.1.3", + "color-string": "^2.1.3" }, "engines": { - "node": ">=12.5.0" + "node": ">=18" } }, "node_modules/color-convert": { @@ -8562,20 +7663,52 @@ "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==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "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==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "engines": { + "node": ">=12.20" } }, "node_modules/color2k": { @@ -8723,9 +7856,9 @@ } }, "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", "license": "MIT", "dependencies": { "object-assign": "^4", @@ -8733,6 +7866,10 @@ }, "engines": { "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/crelt": { @@ -8832,9 +7969,9 @@ "license": "MIT" }, "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", "license": "MIT", "dependencies": { "character-entities": "^2.0.0" @@ -9103,9 +8240,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "version": "1.5.278", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", + "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", "dev": true, "license": "ISC" }, @@ -9276,12 +8413,12 @@ "license": "MIT" }, "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9483,9 +8620,9 @@ "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -9669,14 +8806,14 @@ } }, "node_modules/framer-motion": { - "version": "12.23.25", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", - "integrity": "sha512-gUHGl2e4VG66jOcH0JHhuJQr6ZNwrET9g31ZG0xdXzT0CznP7fHX4P8Bcvuc4MiUB90ysNnWX2ukHRIggkl6hQ==", + "version": "12.29.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.29.0.tgz", + "integrity": "sha512-1gEFGXHYV2BD42ZPTFmSU9buehppU+bCuOnHU0AD18DKh9j4DuTx47MvqY5ax+NNWRtK32qIcJf1UxKo1WwjWg==", "license": "MIT", "peer": true, "dependencies": { - "motion-dom": "^12.23.23", - "motion-utils": "^12.23.6", + "motion-dom": "^12.29.0", + "motion-utils": "^12.27.2", "tslib": "^2.4.0" }, "peerDependencies": { @@ -9712,9 +8849,9 @@ "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -9993,6 +9130,16 @@ "react-is": "^16.7.0" } }, + "node_modules/hono": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.5.tgz", + "integrity": "sha512-WemPi9/WfyMwZs+ZUXdiwcCh9Y+m7L+8vki9MzDw3jJ+W9Lc+12HGsd368Qc1vZi1xwW8BWMMsnK5efYKPdt4g==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/html-entities": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", @@ -10029,9 +9176,9 @@ } }, "node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10043,14 +9190,14 @@ "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" + "domutils": "^3.2.2", + "entities": "^7.0.1" } }, "node_modules/htmlparser2/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -10089,9 +9236,9 @@ } }, "node_modules/i18next": { - "version": "25.7.2", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.7.2.tgz", - "integrity": "sha512-58b4kmLpLv1buWUEwegMDUqZVR5J+rT+WTRFaBGL7lxDuJQQ0NrJFrq+eT2N94aYVR1k1Sr13QITNOL88tZCuw==", + "version": "25.8.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.0.tgz", + "integrity": "sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==", "funding": [ { "type": "individual", @@ -10129,9 +9276,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -10555,6 +9702,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10620,9 +9773,9 @@ "license": "MIT" }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.camelcase": { @@ -10765,6 +9918,18 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mdast-util-from-markdown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", @@ -11917,19 +11082,19 @@ "license": "MIT" }, "node_modules/motion-dom": { - "version": "12.23.23", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.23.tgz", - "integrity": "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA==", + "version": "12.29.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.29.0.tgz", + "integrity": "sha512-3eiz9bb32yvY8Q6XNM4AwkSOBPgU//EIKTZwsSWgA9uzbPBhZJeScCVcBuwwYVqhfamewpv7ZNmVKTGp5qnzkA==", "license": "MIT", "peer": true, "dependencies": { - "motion-utils": "^12.23.6" + "motion-utils": "^12.27.2" } }, "node_modules/motion-utils": { - "version": "12.23.6", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz", - "integrity": "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==", + "version": "12.27.2", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.27.2.tgz", + "integrity": "sha512-B55gcoL85Mcdt2IEStY5EEAsrMSVE2sI14xQ/uAdPL+mfQxhKKFaEag9JmfxedJOR4vZpBGoPeC/Gm13I/4g5Q==", "license": "MIT", "peer": true }, @@ -11960,9 +11125,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", "funding": [ { "type": "github", @@ -11971,10 +11136,10 @@ ], "license": "MIT", "bin": { - "nanoid": "bin/nanoid.cjs" + "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18 || >=20" } }, "node_modules/napi-build-utils": { @@ -11993,9 +11158,9 @@ } }, "node_modules/node-abi": { - "version": "3.85.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", - "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", + "version": "3.87.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", + "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -12004,6 +11169,18 @@ "node": ">=10" } }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -12060,16 +11237,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -12161,9 +11328,9 @@ } }, "node_modules/openai": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.13.0.tgz", - "integrity": "sha512-yHbMo+EpNGPG3sRrXvmo0LhUPFN4bAURJw3G17bE+ax1G4tcTFCa9ZjvCWh3cvni0aHY0uWlk2IxcsPH4NR9Ow==", + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.16.0.tgz", + "integrity": "sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==", "license": "Apache-2.0", "bin": { "openai": "bin/cli" @@ -12353,14 +11520,14 @@ } }, "node_modules/platejs": { - "version": "52.0.11", - "resolved": "https://registry.npmjs.org/platejs/-/platejs-52.0.11.tgz", - "integrity": "sha512-yBkx+x5HjDnmEBjaH8SbgX++1e48OVRTTXxPSSHDyhazXJipQuGMTYQ9wnKWjcvz/tlgDTDug95cBwC52X8JSQ==", + "version": "52.0.17", + "resolved": "https://registry.npmjs.org/platejs/-/platejs-52.0.17.tgz", + "integrity": "sha512-vJZijt8coKh6W60RmUG69DFM4ZwLhzNwSfOwfk5SkVWer1iDqqyW34JnGn5nKI8irj+45/sSzx4Nfgw9CR+QYw==", "license": "MIT", "dependencies": { - "@platejs/core": "52.0.11", + "@platejs/core": "52.0.17", "@platejs/slate": "52.0.10", - "@platejs/utils": "52.0.11", + "@platejs/utils": "52.0.17", "@udecode/react-hotkeys": "52.0.11", "@udecode/react-utils": "52.0.11", "@udecode/utils": "52.0.1", @@ -12508,7 +11675,7 @@ "postcss": "^8.2.14" } }, - "node_modules/postcss-selector-parser": { + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", @@ -12521,12 +11688,43 @@ "node": ">=4" } }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -12648,9 +11846,9 @@ } }, "node_modules/prosemirror-markdown": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", - "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.3.tgz", + "integrity": "sha512-3E+Et6cdXIH0EgN2tGYQ+EBT7N4kMiZFsW+hzx+aPtOmADDHWCdd2uUQb7yklJrfUYUOjEEu22BiN6UFgPe4cQ==", "license": "MIT", "dependencies": { "@types/markdown-it": "^14.0.0", @@ -12711,9 +11909,9 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.4.tgz", - "integrity": "sha512-CGr2BK5sLdZx+ARbeLO4HBZYa3qSG3FmwOVmzYs0Zp7n5SkrGqj+1CeNuubFNZEr64yMAQ20SanbFyIyHWZc8w==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.2.3", @@ -12738,31 +11936,19 @@ "prosemirror-view": "^1.33.8" } }, - "node_modules/prosemirror-trailing-node/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/prosemirror-transform": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.5.tgz", - "integrity": "sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.11.0.tgz", + "integrity": "sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.41.4", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz", - "integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==", + "version": "1.41.5", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.5.tgz", + "integrity": "sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", @@ -12839,9 +12025,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -13035,12 +12221,12 @@ } }, "node_modules/react-i18next": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.0.tgz", - "integrity": "sha512-IMpPTyCTKxEj8klCrLKUTIUa8uYTd851+jcu2fJuUB9Agkk9Qq8asw4omyeHVnOXHrLgQJGTm5zTvn8HpaPiqw==", + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.3.tgz", + "integrity": "sha512-fo+/NNch37zqxOzlBYrWMx0uy/yInPkRfjSuy4lqKdaecR17nvCHnEUt3QyzA8XjQ2B/0iW/5BhaHR3ZmukpGw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.27.6", + "@babel/runtime": "^7.28.4", "html-parse-stringify": "^3.0.1", "use-sync-external-store": "^1.6.0" }, @@ -13105,9 +12291,9 @@ } }, "node_modules/react-router": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.11.0.tgz", - "integrity": "sha512-uI4JkMmjbWCZc01WVP2cH7ZfSzH91JAZUDd7/nIprDgWxBV1TkkmLToFh7EbMTcMak8URFRa2YoBL/W8GWnCTQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.0.tgz", + "integrity": "sha512-PZgus8ETambRT17BUm/LL8lX3Of+oiLaPuVTRH3l1eLvSPpKO3AvhAEb5N7ihAFZQrYDqkvvWfFh9p0z9VsjLw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -13127,12 +12313,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.11.0.tgz", - "integrity": "sha512-e49Ir/kMGRzFOOrYQBdoitq3ULigw4lKbAyKusnvtDu2t4dBX4AGYPrzNvorXmVuOyeakai6FUPW5MmibvVG8g==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.0.tgz", + "integrity": "sha512-5CO/l5Yahi2SKC6rGZ+HDEjpjkGaG/ncEP7eWFTvFxbHP8yeeI0PxTDjimtpXYlR3b3i9/WIL4VJttPrESIf2g==", "license": "MIT", "dependencies": { - "react-router": "7.11.0" + "react-router": "7.13.0" }, "engines": { "node": ">=20.0.0" @@ -13421,9 +12607,9 @@ } }, "node_modules/rollup": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", - "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "version": "4.56.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz", + "integrity": "sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==", "dev": true, "license": "MIT", "dependencies": { @@ -13437,28 +12623,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.3", - "@rollup/rollup-android-arm64": "4.53.3", - "@rollup/rollup-darwin-arm64": "4.53.3", - "@rollup/rollup-darwin-x64": "4.53.3", - "@rollup/rollup-freebsd-arm64": "4.53.3", - "@rollup/rollup-freebsd-x64": "4.53.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", - "@rollup/rollup-linux-arm-musleabihf": "4.53.3", - "@rollup/rollup-linux-arm64-gnu": "4.53.3", - "@rollup/rollup-linux-arm64-musl": "4.53.3", - "@rollup/rollup-linux-loong64-gnu": "4.53.3", - "@rollup/rollup-linux-ppc64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-gnu": "4.53.3", - "@rollup/rollup-linux-riscv64-musl": "4.53.3", - "@rollup/rollup-linux-s390x-gnu": "4.53.3", - "@rollup/rollup-linux-x64-gnu": "4.53.3", - "@rollup/rollup-linux-x64-musl": "4.53.3", - "@rollup/rollup-openharmony-arm64": "4.53.3", - "@rollup/rollup-win32-arm64-msvc": "4.53.3", - "@rollup/rollup-win32-ia32-msvc": "4.53.3", - "@rollup/rollup-win32-x64-gnu": "4.53.3", - "@rollup/rollup-win32-x64-msvc": "4.53.3", + "@rollup/rollup-android-arm-eabi": "4.56.0", + "@rollup/rollup-android-arm64": "4.56.0", + "@rollup/rollup-darwin-arm64": "4.56.0", + "@rollup/rollup-darwin-x64": "4.56.0", + "@rollup/rollup-freebsd-arm64": "4.56.0", + "@rollup/rollup-freebsd-x64": "4.56.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.56.0", + "@rollup/rollup-linux-arm-musleabihf": "4.56.0", + "@rollup/rollup-linux-arm64-gnu": "4.56.0", + "@rollup/rollup-linux-arm64-musl": "4.56.0", + "@rollup/rollup-linux-loong64-gnu": "4.56.0", + "@rollup/rollup-linux-loong64-musl": "4.56.0", + "@rollup/rollup-linux-ppc64-gnu": "4.56.0", + "@rollup/rollup-linux-ppc64-musl": "4.56.0", + "@rollup/rollup-linux-riscv64-gnu": "4.56.0", + "@rollup/rollup-linux-riscv64-musl": "4.56.0", + "@rollup/rollup-linux-s390x-gnu": "4.56.0", + "@rollup/rollup-linux-x64-gnu": "4.56.0", + "@rollup/rollup-linux-x64-musl": "4.56.0", + "@rollup/rollup-openbsd-x64": "4.56.0", + "@rollup/rollup-openharmony-arm64": "4.56.0", + "@rollup/rollup-win32-arm64-msvc": "4.56.0", + "@rollup/rollup-win32-ia32-msvc": "4.56.0", + "@rollup/rollup-win32-x64-gnu": "4.56.0", + "@rollup/rollup-win32-x64-msvc": "4.56.0", "fsevents": "~2.3.2" } }, @@ -13561,52 +12750,54 @@ "license": "MIT" }, "node_modules/scroll-into-view-if-needed": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.0.10.tgz", - "integrity": "sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", + "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", "license": "MIT", "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "debug": "^4.3.5", + "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "statuses": "^2.0.2" }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { "encodeurl": "^2.0.0", @@ -13616,6 +12807,10 @@ }, "engines": { "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/set-cookie-parser": { @@ -13675,6 +12870,19 @@ "@img/sharp-win32-x64": "0.34.5" } }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "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", @@ -13846,15 +13054,6 @@ "slate": ">=0.99.0" } }, - "node_modules/slate-dom/node_modules/scroll-into-view-if-needed": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", - "license": "MIT", - "dependencies": { - "compute-scroll-into-view": "^3.0.2" - } - }, "node_modules/slate-hyperscript": { "version": "0.100.0", "resolved": "https://registry.npmjs.org/slate-hyperscript/-/slate-hyperscript-0.100.0.tgz", @@ -13887,15 +13086,6 @@ "slate-dom": ">=0.119.0" } }, - "node_modules/slate-react/node_modules/scroll-into-view-if-needed": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", - "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==", - "license": "MIT", - "dependencies": { - "compute-scroll-into-view": "^3.0.2" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -14071,9 +13261,9 @@ } }, "node_modules/tabbable": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", - "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", "license": "MIT" }, "node_modules/table-layout": { @@ -14099,9 +13289,9 @@ } }, "node_modules/tailwind-merge": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", - "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", "license": "MIT", "funding": { "type": "github", @@ -14109,9 +13299,9 @@ } }, "node_modules/tailwind-variants": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.1.1.tgz", - "integrity": "sha512-ftLXe3krnqkMHsuBTEmaVUXYovXtPyTK7ckEfDRXS8PBZx0bAUas+A0jYxuKA5b8qg++wvQ3d2MQ7l/xeZxbZQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-3.2.2.tgz", + "integrity": "sha512-Mi4kHeMTLvKlM98XPnK+7HoBPmf4gygdFmqQPaDivc3DpYS6aIY6KiG/PgThrGvii5YZJqRsPz0aPyhoFzmZgg==", "license": "MIT", "engines": { "node": ">=16.x", @@ -14128,9 +13318,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", - "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -14164,6 +13354,19 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/tar-fs": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", @@ -14443,18 +13646,18 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.16.0.tgz", - "integrity": "sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.19.1.tgz", + "integrity": "sha512-Gpq0iNm5M6cQWlyHQv9MV+uOj1jWk7LpkoE5vSp/7zjb4zMdAcUD+VL5y0nH4p9EbUklq00eVIIX/XcDHzu5xg==", "license": "MIT", "engines": { "node": ">=20.18.1" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "license": "MIT" }, "node_modules/unified": { @@ -14543,9 +13746,9 @@ } }, "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", @@ -14590,9 +13793,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", - "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -14713,16 +13916,16 @@ "license": "MIT" }, "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/vary": { @@ -14759,6 +13962,15 @@ "node": ">=20.x" } }, + "node_modules/vectra/node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/vectra/node_modules/openai": { "version": "4.104.0", "resolved": "https://registry.npmjs.org/openai/-/openai-4.104.0.tgz", @@ -14789,6 +14001,25 @@ } } }, + "node_modules/vectra/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/vectra/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, "node_modules/vectra/node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", @@ -14922,6 +14153,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "license": "MIT", "dependencies": { "iconv-lite": "0.6.3" @@ -15149,6 +14381,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/xterm": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/xterm/-/xterm-5.3.0.tgz", + "integrity": "sha512-8QqjlekLUFTrU6x7xck1MsPzPA571K5zNqWm0M0oroYEWVOptZ0+ubQSkQ3uxIEhcIHRujJy6emDWX4A7qyFzg==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", + "license": "MIT" + }, + "node_modules/xterm-addon-fit": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.8.0.tgz", + "integrity": "sha512-yj3Np7XlvxxhYF/EJ7p3KHaMt6OdwQ+HDu573Vx1lRXsVxOcnVJs51RgjZOouIZOczTsskaS+CpXspK81/DLqw==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", + "license": "MIT", + "peerDependencies": { + "xterm": "^5.0.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15193,27 +14442,27 @@ } }, "node_modules/zod": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", - "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", "license": "ISC", "peerDependencies": { "zod": "^3.25 || ^4" } }, "node_modules/zustand": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.9.tgz", - "integrity": "sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.10.tgz", + "integrity": "sha512-U1AiltS1O9hSy3rul+Ub82ut2fqIAefiSuwECWt6jlMVUGejvf+5omLcRBSzqbRagSM3hQZbtzdeRc6QVScXTg==", "license": "MIT", "engines": { "node": ">=12.20.0" diff --git a/package.json b/package.json index 4e26781..e0847f3 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@tauri-apps/plugin-clipboard-manager": "^2.3.2", "@tauri-apps/plugin-shell": "^2.3.3", "@tiptap/extension-bubble-menu": "^3.14.0", - "@tiptap/extension-code-block-lowlight": "^3.14.0", + "@tiptap/extension-code-block": "^3.18.0", "@tiptap/extension-floating-menu": "^3.14.0", "@tiptap/extension-horizontal-rule": "^3.14.0", "@tiptap/extension-image": "^3.14.0", @@ -108,6 +108,7 @@ "cors": "^2.8.5", "express": "^5.0.1", "fs-extra": "^11.3.2", + "highlight.js": "^11.11.1", "i18next": "^25.7.2", "i18next-browser-languagedetector": "^8.2.0", "lowlight": "^3.3.0", @@ -129,6 +130,8 @@ "remark-toc": "^9.0.0", "tiptap-markdown": "^0.9.0", "vectra": "^0.11.1", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0", "zod": "^4.1.13" }, "devDependencies": { @@ -142,6 +145,6 @@ "vite": "^5.4.8" }, "optionalDependencies": { - "@aicontextlab/core-native": "^0.1.0" + "@aicontextlab/core-native": "^0.2.1" } } diff --git a/src-ios/App.js b/src-ios/App.js new file mode 100644 index 0000000..05870d0 --- /dev/null +++ b/src-ios/App.js @@ -0,0 +1,256 @@ +require('react-native-gesture-handler'); +const React = require('react'); +const { Pressable, Text, View, StyleSheet } = require('react-native'); +const { Ionicons } = require('@expo/vector-icons'); +const { GestureHandlerRootView } = require('react-native-gesture-handler'); +const { NavigationContainer } = require('@react-navigation/native'); +const { createBottomTabNavigator } = require('@react-navigation/bottom-tabs'); +const { createNativeStackNavigator } = require('@react-navigation/native-stack'); +const { SafeAreaProvider, useSafeAreaInsets } = require('react-native-safe-area-context'); +const { I18nextProvider, useTranslation } = require('react-i18next'); +const { initI18n } = require('./i18n'); +const { initDb } = require('./db'); +const IdeasScreen = require('./screens/IdeasScreen'); +const SettingsScreen = require('./screens/SettingsScreen'); +const { colors, typography } = require('./theme'); + +const Tab = createBottomTabNavigator(); +const Stack = createNativeStackNavigator(); + +function IdeasStack() { + return ( + <Stack.Navigator screenOptions={{ headerShown: false }}> + <Stack.Screen name="IdeasHome" component={IdeasScreen} /> + </Stack.Navigator> + ); +} + +function TabIcon({ name, color, focused }) { + return ( + <Ionicons name={name} size={18} color={color} /> + ); +} + +function FloatingTabBar({ state, descriptors, navigation }) { + const insets = useSafeAreaInsets(); + const bottomPad = Math.max(insets.bottom - 12, 8); + return ( + <View + pointerEvents="box-none" + style={[ + styles.floatingBarWrap, + { paddingBottom: bottomPad }, + ]} + > + <View style={styles.floatingBar}> + {state.routes.map((route, index) => { + const { options } = descriptors[route.key]; + const label = + options.tabBarLabel !== undefined + ? options.tabBarLabel + : options.title !== undefined + ? options.title + : route.name; + const isFocused = state.index === index; + const onPress = () => { + const event = navigation.emit({ + type: 'tabPress', + target: route.key, + canPreventDefault: true, + }); + if (!isFocused && !event.defaultPrevented) { + navigation.navigate(route.name); + } + }; + const onLongPress = () => { + navigation.emit({ + type: 'tabLongPress', + target: route.key, + }); + }; + const color = isFocused ? colors.accent : colors.mutedInk; + const icon = options.tabBarIcon + ? options.tabBarIcon({ focused: isFocused, color, size: 18 }) + : null; + return ( + <Pressable + key={route.key} + onPress={onPress} + onLongPress={onLongPress} + accessibilityRole="button" + accessibilityState={isFocused ? { selected: true } : {}} + accessibilityLabel={options.tabBarAccessibilityLabel} + testID={options.tabBarTestID} + style={({ pressed }) => [ + styles.segmentButton, + isFocused && styles.segmentButtonActive, + pressed && styles.segmentButtonPressed, + ]} + > + <View style={styles.segmentContent}> + {icon} + <Text style={[styles.segmentLabel, isFocused && styles.segmentLabelActive]}> + {label} + </Text> + </View> + </Pressable> + ); + })} + </View> + </View> + ); +} + +function RootTabs() { + const { t } = useTranslation(); + return ( + <Tab.Navigator + screenOptions={{ + headerShown: false, + tabBarStyle: styles.tabBarPlaceholder, + tabBarHideOnKeyboard: true, + }} + tabBar={(props) => <FloatingTabBar {...props} />} + > + <Tab.Screen + name="Ideas" + component={IdeasStack} + options={{ + title: t('app.ideas'), + tabBarIcon: (props) => <TabIcon {...props} name="bulb-outline" />, + }} + /> + <Tab.Screen + name="Settings" + component={SettingsScreen} + options={{ + title: t('app.settings'), + tabBarIcon: (props) => <TabIcon {...props} name="settings-outline" />, + }} + /> + </Tab.Navigator> + ); +} + +function LoadingScreen() { + return ( + <View style={styles.loading}> + <Text style={styles.loadingText}>OpenContext</Text> + </View> + ); +} + +function AppContainer() { + const [ready, setReady] = React.useState(false); + + React.useEffect(() => { + let active = true; + Promise.all([initI18n(), initDb()]).then(() => { + if (active) { + setReady(true); + } + }); + return () => { + active = false; + }; + }, []); + + if (!ready) { + return <LoadingScreen />; + } + + return ( + <GestureHandlerRootView style={styles.root}> + <SafeAreaProvider> + <NavigationContainer> + <RootTabs /> + </NavigationContainer> + </SafeAreaProvider> + </GestureHandlerRootView> + ); +} + +function App() { + return ( + <I18nextProvider i18n={require('i18next')}> + <AppContainer /> + </I18nextProvider> + ); +} + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + loading: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: colors.paper, + }, + loadingText: { + ...typography.title, + }, + tabBarPlaceholder: { + height: 0, + backgroundColor: 'transparent', + borderTopWidth: 0, + }, + floatingBarWrap: { + position: 'absolute', + left: 0, + right: 0, + bottom: 0, + paddingTop: 6, + paddingHorizontal: 16, + alignItems: 'center', + zIndex: 20, + }, + floatingBar: { + width: '50%', + maxWidth: 320, + minWidth: 120, + padding: 4, + flexDirection: 'row', + alignItems: 'center', + backgroundColor: 'rgba(255, 255, 255, 0.9)', + borderRadius: 28, + borderWidth: 0, + shadowColor: colors.shadow, + shadowOpacity: 0.06, + shadowRadius: 12, + shadowOffset: { width: 0, height: 6 }, + elevation: 8, + }, + segmentButton: { + flex: 1, + height: 40, + borderRadius: 20, + alignItems: 'center', + justifyContent: 'center', + marginHorizontal: 2, + }, + segmentButtonActive: { + backgroundColor: 'rgba(231, 111, 44, 0.14)', + }, + segmentButtonPressed: { + backgroundColor: 'rgba(231, 111, 44, 0.2)', + }, + segmentContent: { + flexDirection: 'row', + alignItems: 'center', + }, + segmentLabel: { + marginLeft: 6, + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + letterSpacing: 0.2, + color: colors.mutedInk, + }, + segmentLabelActive: { + color: colors.accent, + fontWeight: '600', + }, +}); + +module.exports = App; diff --git a/src-ios/README.md b/src-ios/README.md new file mode 100644 index 0000000..e1e2e2b --- /dev/null +++ b/src-ios/README.md @@ -0,0 +1,22 @@ +# OpenContext iOS MVP + +This folder contains a React Native (Expo) iOS MVP for OpenContext. + +## Run + +```bash +cd src-ios +npm install +npm run ios +``` + +## Notes + +- SQLite schema mirrors `crates/opencontext-core/src/lib.rs`. +- Documents are stored as Markdown files under the app sandbox (editor UI pending). +- Ideas are stored as Markdown files under `.ideas/`. +- Settings are stored in AsyncStorage (language only). + +## AI Reflection (Ideas) + +Configure via Settings > AI. diff --git a/src-ios/app.json b/src-ios/app.json new file mode 100644 index 0000000..55bf664 --- /dev/null +++ b/src-ios/app.json @@ -0,0 +1,25 @@ +{ + "expo": { + "name": "OpenContext", + "slug": "opencontext", + "version": "0.1.0", + "orientation": "portrait", + "userInterfaceStyle": "light", + "icon": "./assets/icon.png", + "assetBundlePatterns": [ + "**/*" + ], + "plugins": [ + [ + "expo-image-picker", + { + "photosPermission": "Allow OpenContext to access your photos to attach images." + } + ] + ], + "ios": { + "supportsTablet": true, + "bundleIdentifier": "com.contextlab.opencontext" + } + } +} diff --git a/src-ios/assets/icon.png b/src-ios/assets/icon.png new file mode 100644 index 0000000..c31a043 Binary files /dev/null and b/src-ios/assets/icon.png differ diff --git a/src-ios/babel.config.js b/src-ios/babel.config.js new file mode 100644 index 0000000..9d89e13 --- /dev/null +++ b/src-ios/babel.config.js @@ -0,0 +1,6 @@ +module.exports = function (api) { + api.cache(true); + return { + presets: ['babel-preset-expo'], + }; +}; diff --git a/src-ios/components/Card.js b/src-ios/components/Card.js new file mode 100644 index 0000000..cd586bd --- /dev/null +++ b/src-ios/components/Card.js @@ -0,0 +1,23 @@ +const React = require('react'); +const { View, StyleSheet } = require('react-native'); +const { colors } = require('../theme'); + +function Card({ children, style }) { + return <View style={[styles.card, style]}>{children}</View>; +} + +const styles = StyleSheet.create({ + card: { + backgroundColor: colors.card, + borderRadius: 18, + padding: 16, + borderWidth: 1, + borderColor: colors.border, + shadowColor: colors.shadow, + shadowOpacity: 0.08, + shadowRadius: 10, + shadowOffset: { width: 0, height: 4 }, + }, +}); + +module.exports = Card; diff --git a/src-ios/components/EmptyState.js b/src-ios/components/EmptyState.js new file mode 100644 index 0000000..097d746 --- /dev/null +++ b/src-ios/components/EmptyState.js @@ -0,0 +1,35 @@ +const React = require('react'); +const { View, Text, StyleSheet } = require('react-native'); +const { typography, colors, spacing } = require('../theme'); + +function EmptyState({ title, body }) { + return ( + <View style={styles.root}> + <Text style={styles.title}>{title}</Text> + <Text style={styles.body}>{body}</Text> + </View> + ); +} + +const styles = StyleSheet.create({ + root: { + paddingHorizontal: spacing.xl, + paddingTop: spacing.xl, + paddingBottom: spacing.lg, + alignItems: 'center', + }, + title: { + ...typography.title, + fontSize: 26, + fontWeight: '700', + textAlign: 'center', + }, + body: { + ...typography.subtitle, + marginTop: spacing.md, + textAlign: 'center', + color: colors.mutedInk, + }, +}); + +module.exports = EmptyState; diff --git a/src-ios/components/FadeInView.js b/src-ios/components/FadeInView.js new file mode 100644 index 0000000..6e016f5 --- /dev/null +++ b/src-ios/components/FadeInView.js @@ -0,0 +1,18 @@ +const React = require('react'); +const { Animated } = require('react-native'); + +function FadeInView({ children, style }) { + const opacity = React.useRef(new Animated.Value(0)).current; + + React.useEffect(() => { + Animated.timing(opacity, { + toValue: 1, + duration: 500, + useNativeDriver: true, + }).start(); + }, [opacity]); + + return <Animated.View style={[style, { opacity }]}>{children}</Animated.View>; +} + +module.exports = FadeInView; diff --git a/src-ios/components/FloatingButton.js b/src-ios/components/FloatingButton.js new file mode 100644 index 0000000..8232a36 --- /dev/null +++ b/src-ios/components/FloatingButton.js @@ -0,0 +1,37 @@ +const React = require('react'); +const { Pressable, StyleSheet, Text } = require('react-native'); +const { colors } = require('../theme'); + +function FloatingButton({ onPress, label }) { + return ( + <Pressable onPress={onPress} style={styles.button}> + <Text style={styles.label}>+</Text> + </Pressable> + ); +} + +const styles = StyleSheet.create({ + button: { + position: 'absolute', + right: 20, + bottom: 30, + backgroundColor: colors.accent, + borderRadius: 24, + width: 48, + height: 48, + alignItems: 'center', + justifyContent: 'center', + shadowColor: colors.shadow, + shadowOpacity: 0.18, + shadowRadius: 8, + shadowOffset: { width: 0, height: 4 }, + }, + label: { + color: '#fff', + fontSize: 28, + fontWeight: '500', + marginTop: -2, + }, +}); + +module.exports = FloatingButton; diff --git a/src-ios/components/Screen.js b/src-ios/components/Screen.js new file mode 100644 index 0000000..346e92f --- /dev/null +++ b/src-ios/components/Screen.js @@ -0,0 +1,33 @@ +const React = require('react'); +const { SafeAreaView, View, StyleSheet } = require('react-native'); +const { LinearGradient } = require('expo-linear-gradient'); +const { colors, spacing } = require('../theme'); + +function Screen({ children }) { + return ( + <LinearGradient + colors={[colors.gradientA, colors.gradientB, colors.gradientC]} + style={styles.root} + > + <SafeAreaView style={styles.safe}> + <View style={styles.inner}>{children}</View> + </SafeAreaView> + </LinearGradient> + ); +} + +const styles = StyleSheet.create({ + root: { + flex: 1, + }, + safe: { + flex: 1, + }, + inner: { + flex: 1, + paddingHorizontal: spacing.lg, + paddingTop: spacing.lg, + }, +}); + +module.exports = Screen; diff --git a/src-ios/config.js b/src-ios/config.js new file mode 100644 index 0000000..caa2d9d --- /dev/null +++ b/src-ios/config.js @@ -0,0 +1,5 @@ +const EDITOR_URL = process.env.EXPO_PUBLIC_EDITOR_URL || 'http://localhost:5173/mobile.html'; + +module.exports = { + EDITOR_URL, +}; diff --git a/src-ios/db/docs.js b/src-ios/db/docs.js new file mode 100644 index 0000000..ed64647 --- /dev/null +++ b/src-ios/db/docs.js @@ -0,0 +1,124 @@ +const FileSystem = require('expo-file-system'); +const { run, all, DOCS_ROOT } = require('./index'); +const { generateStableId } = require('../utils/uuid'); +const { joinPath } = require('../utils/paths'); + +async function listDocs() { + return all( + `SELECT id, name, rel_path, abs_path, description, stable_id, created_at, updated_at + FROM docs + ORDER BY updated_at DESC`, + ); +} + +async function getDocById(id) { + const rows = await all( + `SELECT id, name, rel_path, abs_path, description, stable_id, created_at, updated_at + FROM docs + WHERE id = ?1`, + [id], + ); + return rows[0] || null; +} + +async function getRootFolderId() { + const rows = await all('SELECT id FROM folders WHERE rel_path = ?1', ['docs']); + return rows[0] ? rows[0].id : null; +} + +async function createDoc({ title, content }) { + const folderId = await getRootFolderId(); + const createdAt = new Date().toISOString(); + const stableId = generateStableId(); + const docTitle = normalizeTitle(title); + const description = extractDescription(content); + const fileName = buildDocFilename(docTitle); + const relPath = `docs/${fileName}`; + const absPath = joinPath(DOCS_ROOT, fileName); + + await FileSystem.writeAsStringAsync(absPath, content || '', { + encoding: FileSystem.EncodingType.UTF8, + }); + + const result = await run( + `INSERT INTO docs (folder_id, name, rel_path, abs_path, description, stable_id, created_at, updated_at) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8)`, + [folderId, docTitle, relPath, absPath, description, stableId, createdAt, createdAt], + ); + return getDocById(result.insertId); +} + +async function updateDoc({ id, title, content }) { + const doc = await getDocById(id); + if (!doc) { + return null; + } + const updatedAt = new Date().toISOString(); + const nextTitle = normalizeTitle(title || doc.name); + const description = extractDescription(content); + + await FileSystem.writeAsStringAsync(doc.abs_path, content || '', { + encoding: FileSystem.EncodingType.UTF8, + }); + + await run( + `UPDATE docs SET name = ?1, description = ?2, updated_at = ?3 WHERE id = ?4`, + [nextTitle, description, updatedAt, id], + ); + + return getDocById(id); +} + +async function deleteDoc(id) { + const doc = await getDocById(id); + if (!doc) { + return false; + } + await run('DELETE FROM docs WHERE id = ?1', [id]); + try { + await FileSystem.deleteAsync(doc.abs_path, { idempotent: true }); + } catch (err) { + // Ignore file deletion failures; DB is the source of truth. + } + return true; +} + +async function loadDocContent(doc) { + try { + return await FileSystem.readAsStringAsync(doc.abs_path, { + encoding: FileSystem.EncodingType.UTF8, + }); + } catch (err) { + return ''; + } +} + +function buildDocFilename(title) { + const safeTitle = String(title || 'untitled') + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-|-$/g, '') + .slice(0, 40) || 'untitled'; + return `${safeTitle}-${Date.now().toString(36)}.md`; +} + +function extractDescription(content) { + const text = String(content || '').trim(); + if (!text) return ''; + const line = text.split('\n').find((l) => l.trim().length > 0); + return (line || '').slice(0, 160); +} + +function normalizeTitle(title) { + return String(title || '').trim() || 'Untitled'; +} + +module.exports = { + listDocs, + getDocById, + createDoc, + updateDoc, + deleteDoc, + loadDocContent, +}; diff --git a/src-ios/db/index.js b/src-ios/db/index.js new file mode 100644 index 0000000..4da6099 --- /dev/null +++ b/src-ios/db/index.js @@ -0,0 +1,84 @@ +const SQLite = require('expo-sqlite'); +const FileSystem = require('expo-file-system'); +const { ensureSchema } = require('./migrations'); +const { resolveDocPaths } = require('../utils/paths'); + +const DB_NAME = 'opencontext.db'; +const APP_ROOT = `${FileSystem.documentDirectory}opencontext/`; +const DOCS_ROOT = `${APP_ROOT}docs/`; + +let dbInstance; + +async function openDb() { + if (!dbInstance) { + dbInstance = SQLite.openDatabase(DB_NAME); + } + return dbInstance; +} + +async function run(sql, params = []) { + const db = await openDb(); + return new Promise((resolve, reject) => { + db.transaction((tx) => { + tx.executeSql( + sql, + params, + (_, result) => resolve(result), + (_, error) => { + reject(error); + return true; + }, + ); + }); + }); +} + +async function all(sql, params = []) { + const db = await openDb(); + return new Promise((resolve, reject) => { + db.transaction((tx) => { + tx.executeSql( + sql, + params, + (_, result) => resolve(result?.rows?._array || []), + (_, error) => { + reject(error); + return true; + }, + ); + }); + }); +} + +async function initDb() { + await FileSystem.makeDirectoryAsync(APP_ROOT, { intermediates: true }); + await FileSystem.makeDirectoryAsync(DOCS_ROOT, { intermediates: true }); + + await ensureSchema({ run, all }); + await ensureRootFolder(); +} + +async function ensureRootFolder() { + const rows = await all('SELECT id FROM folders WHERE rel_path = ?1', ['docs']); + if (rows && rows.length > 0) { + return rows[0].id; + } + + const createdAt = new Date().toISOString(); + const { absPath } = resolveDocPaths({ documentsRoot: DOCS_ROOT, relPath: '' }); + const result = await run( + `INSERT INTO folders (parent_id, name, rel_path, abs_path, description, created_at, updated_at) + VALUES (NULL, ?1, ?2, ?3, '', ?4, ?5)`, + ['docs', 'docs', absPath, createdAt, createdAt], + ); + return result.insertId; +} + +module.exports = { + initDb, + run, + all, + openDb, + APP_ROOT, + DOCS_ROOT, +}; diff --git a/src-ios/db/migrations.js b/src-ios/db/migrations.js new file mode 100644 index 0000000..a6eaeb5 --- /dev/null +++ b/src-ios/db/migrations.js @@ -0,0 +1,46 @@ +const { SCHEMA_STATEMENTS } = require('./schema'); +const { generateStableId } = require('../utils/uuid'); + +async function ensureSchema({ run, all }) { + for (const statement of SCHEMA_STATEMENTS) { + await run(statement); + } + + await ensureStableIdColumn({ run, all }); + await backfillStableIds({ run, all }); +} + +async function ensureStableIdColumn({ run, all }) { + const columns = await all('PRAGMA table_info(docs)'); + const hasStableId = Array.isArray(columns) + && columns.some((col) => col && col.name === 'stable_id'); + + if (!hasStableId) { + await run('ALTER TABLE docs ADD COLUMN stable_id TEXT'); + } + + await run('CREATE UNIQUE INDEX IF NOT EXISTS idx_docs_stable_id ON docs(stable_id)'); +} + +async function backfillStableIds({ run, all }) { + const rows = await all( + "SELECT id FROM docs WHERE stable_id IS NULL OR stable_id = ''", + ); + if (!Array.isArray(rows) || rows.length === 0) { + return; + } + + for (const row of rows) { + if (!row || typeof row.id !== 'number') { + continue; + } + await run('UPDATE docs SET stable_id = ?1 WHERE id = ?2', [ + generateStableId(), + row.id, + ]); + } +} + +module.exports = { + ensureSchema, +}; diff --git a/src-ios/db/schema.js b/src-ios/db/schema.js new file mode 100644 index 0000000..4028f12 --- /dev/null +++ b/src-ios/db/schema.js @@ -0,0 +1,29 @@ +const SCHEMA_STATEMENTS = [ + 'PRAGMA foreign_keys = ON', + `CREATE TABLE IF NOT EXISTS folders ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + parent_id INTEGER REFERENCES folders(id) ON DELETE CASCADE, + name TEXT NOT NULL, + rel_path TEXT NOT NULL UNIQUE, + abs_path TEXT NOT NULL, + description TEXT DEFAULT '', + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + )`, + `CREATE TABLE IF NOT EXISTS docs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + folder_id INTEGER NOT NULL REFERENCES folders(id) ON DELETE CASCADE, + name TEXT NOT NULL, + rel_path TEXT NOT NULL UNIQUE, + abs_path TEXT NOT NULL, + description TEXT DEFAULT '', + stable_id TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL + )`, + 'CREATE UNIQUE INDEX IF NOT EXISTS idx_docs_stable_id ON docs(stable_id)', +]; + +module.exports = { + SCHEMA_STATEMENTS, +}; diff --git a/src-ios/i18n/index.js b/src-ios/i18n/index.js new file mode 100644 index 0000000..dc830df --- /dev/null +++ b/src-ios/i18n/index.js @@ -0,0 +1,38 @@ +const i18n = require('i18next'); +const { initReactI18next } = require('react-i18next'); +const AsyncStorage = require('@react-native-async-storage/async-storage').default; +const en = require('./locales/en.json'); +const zh = require('./locales/zh.json'); + +const LANGUAGE_KEY = '@opencontext/lang'; + +async function initI18n() { + const stored = await AsyncStorage.getItem(LANGUAGE_KEY); + const initialLanguage = stored || 'zh'; + + await i18n.use(initReactI18next).init({ + resources: { + en: { translation: en }, + zh: { translation: zh }, + }, + lng: initialLanguage, + fallbackLng: 'en', + compatibilityJSON: 'v3', + interpolation: { escapeValue: false }, + }); +} + +async function setLanguage(lang) { + await i18n.changeLanguage(lang); + await AsyncStorage.setItem(LANGUAGE_KEY, lang); +} + +async function getLanguage() { + return AsyncStorage.getItem(LANGUAGE_KEY); +} + +module.exports = { + initI18n, + setLanguage, + getLanguage, +}; diff --git a/src-ios/i18n/locales/en.json b/src-ios/i18n/locales/en.json new file mode 100644 index 0000000..40e0ab0 --- /dev/null +++ b/src-ios/i18n/locales/en.json @@ -0,0 +1,95 @@ +{ + "app": { + "ideas": "Ideas", + "docs": "Documents", + "settings": "Settings" + }, + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "hideKeyboard": "Hide", + "edit": "Edit", + "create": "Create", + "title": "Title", + "content": "Content", + "emptyTitle": "Untitled" + }, + "ideas": { + "title": "Ideas", + "boxInbox": "Inbox", + "boxAdd": "New box", + "boxCreateTitle": "New Ideas Box", + "boxCreateHint": "Enter box name", + "boxRenameTitle": "Rename Ideas Box", + "boxRenameHint": "Enter new box name", + "boxDeleteTitle": "Delete Ideas Box", + "boxDeleteConfirm": "Delete \"{{name}}\"?", + "boxNameInvalid": "Name cannot contain / or \\", + "boxActionsTitle": "Ideas Box", + "boxRename": "Rename", + "boxDelete": "Delete", + "boxMove": "Move", + "boxMoveTitle": "Move to Ideas Box", + "boxMoveHint": "Select the destination box", + "boxCurrent": "Current", + "boxMoveConfirm": "Move", + "emptyTitle": "Capture your first idea", + "emptyBody": "Quick notes, daily reflections, loose thoughts.", + "editorPlaceholder": "What's new on your mind?", + "subtitle": "Quick notes, daily reflections, loose thoughts.", + "prompt": "What's new on your mind?", + "publish": "Post", + "addImage": "Image", + "continue": "Continue", + "continuePlaceholder": "Continue this idea...", + "continueContext": "Current idea", + "continueHint": "Continue writing here", + "entryActionsTitle": "Delete idea", + "deleteEntry": "Delete entry", + "deleteEntryHint": "This entry will be removed.", + "deleteEntryConfirm": "Delete this entry?", + "deleteThread": "Delete entire idea", + "deleteThreadConfirm": "Delete this entire idea?", + "deleteThreadHint": "All entries in this idea will be deleted.", + "aiReflect": "AI Reflect", + "aiThinking": "AI is thinking...", + "aiError": "AI failed to respond. Check configuration or try again.", + "aiRetry": "Retry", + "aiNotConfigured": "AI is not configured. Set an API key in env.", + "aiEmpty": "AI returned empty content.", + "aiPlaceholder": "Edit AI content...", + "reflectionEditable": "AI content is editable", + "imagePermissionTitle": "Photo access needed", + "imagePermissionBody": "Allow photo access to add images.", + "imageLimit": "You can add up to {{count}} images", + "imageImportFailed": "Failed to import image. Please try again." + }, + "docs": { + "title": "Documents", + "emptyTitle": "No documents yet", + "emptyBody": "Create a doc to organize longer writing.", + "comingSoon": "Document editor is coming soon." + }, + "settings": { + "title": "Settings", + "language": "Language", + "about": "Local-only MVP for iOS", + "aiTitle": "AI Settings", + "aiModel": "Model", + "aiApiBase": "API Base", + "aiApiKey": "API Key", + "aiPrompt": "Prompt", + "aiPromptPlaceholder": "Describe how AI should respond...", + "saving": "Saving...", + "saved": "Saved", + "saveFailed": "Save failed. Try again." + }, + "time": { + "today": "Today", + "yesterday": "Yesterday", + "justNow": "Just now", + "minutesAgo": "{{count}} min ago", + "hoursAgo": "{{count}} hr ago" + } +} diff --git a/src-ios/i18n/locales/zh.json b/src-ios/i18n/locales/zh.json new file mode 100644 index 0000000..0b3420f --- /dev/null +++ b/src-ios/i18n/locales/zh.json @@ -0,0 +1,95 @@ +{ + "app": { + "ideas": "想法", + "docs": "文档", + "settings": "设置" + }, + "common": { + "save": "保存", + "cancel": "取消", + "delete": "删除", + "hideKeyboard": "收起", + "edit": "编辑", + "create": "创建", + "title": "标题", + "content": "内容", + "emptyTitle": "未命名" + }, + "ideas": { + "title": "想法", + "boxInbox": "Inbox", + "boxAdd": "新建想法箱", + "boxCreateTitle": "新建想法箱", + "boxCreateHint": "输入想法箱名称", + "boxRenameTitle": "重命名想法箱", + "boxRenameHint": "输入新的想法箱名称", + "boxDeleteTitle": "删除想法箱", + "boxDeleteConfirm": "确定删除「{{name}}」吗?", + "boxNameInvalid": "名称不能包含 / 或 \\", + "boxActionsTitle": "想法箱", + "boxRename": "重命名", + "boxDelete": "删除", + "boxMove": "移动", + "boxMoveTitle": "移动到想法箱", + "boxMoveHint": "选择目标想法箱", + "boxCurrent": "当前", + "boxMoveConfirm": "移动", + "emptyTitle": "记录你的第一条想法", + "emptyBody": "快速记录、日常反思或灵感片段。", + "editorPlaceholder": "有什么新想法?", + "subtitle": "快速记录、日常反思或灵感片段。", + "prompt": "有什么新想法?", + "publish": "发布", + "addImage": "图片", + "continue": "继续写", + "continuePlaceholder": "继续这个想法...", + "continueContext": "当前想法", + "continueHint": "继续写在这里", + "entryActionsTitle": "删除想法", + "deleteEntry": "删除这条想法", + "deleteEntryHint": "这条想法将被删除。", + "deleteEntryConfirm": "删除这条想法?", + "deleteThread": "删除整个想法", + "deleteThreadConfirm": "删除整个想法?", + "deleteThreadHint": "该想法下的所有记录都会被删除。", + "aiReflect": "AI 思考", + "aiThinking": "AI 正在思考...", + "aiError": "AI 思考失败,请检查配置或稍后重试。", + "aiRetry": "重试", + "aiNotConfigured": "AI 未配置,请在环境变量中设置 API Key。", + "aiEmpty": "AI 未返回内容。", + "aiPlaceholder": "可编辑 AI 内容...", + "reflectionEditable": "可编辑 AI 内容", + "imagePermissionTitle": "需要访问照片", + "imagePermissionBody": "请允许访问相册以添加图片。", + "imageLimit": "最多可添加 {{count}} 张图片", + "imageImportFailed": "导入图片失败,请重试。" + }, + "docs": { + "title": "文档", + "emptyTitle": "暂无文档", + "emptyBody": "创建一篇文档来整理更完整的内容。", + "comingSoon": "文档编辑即将上线。" + }, + "settings": { + "title": "设置", + "language": "语言", + "about": "仅本地存储的 iOS MVP", + "aiTitle": "AI 设置", + "aiModel": "模型", + "aiApiBase": "API 地址", + "aiApiKey": "API Key", + "aiPrompt": "提示词", + "aiPromptPlaceholder": "你希望 AI 以什么方式回应...", + "saving": "保存中...", + "saved": "已保存", + "saveFailed": "保存失败,请稍后重试。" + }, + "time": { + "today": "今天", + "yesterday": "昨天", + "justNow": "刚刚", + "minutesAgo": "{{count}} 分钟前", + "hoursAgo": "{{count}} 小时前" + } +} diff --git a/src-ios/index.js b/src-ios/index.js new file mode 100644 index 0000000..8e348e7 --- /dev/null +++ b/src-ios/index.js @@ -0,0 +1,12 @@ +const { ensureSchema } = require('./db/migrations'); +const { SCHEMA_STATEMENTS } = require('./db/schema'); +const { generateStableId } = require('./utils/uuid'); +const { joinPath, resolveDocPaths } = require('./utils/paths'); + +module.exports = { + ensureSchema, + SCHEMA_STATEMENTS, + generateStableId, + joinPath, + resolveDocPaths, +}; diff --git a/src-ios/ios/.gitignore b/src-ios/ios/.gitignore new file mode 100644 index 0000000..8beb344 --- /dev/null +++ b/src-ios/ios/.gitignore @@ -0,0 +1,30 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace +.xcode.env.local + +# Bundle artifacts +*.jsbundle + +# CocoaPods +/Pods/ diff --git a/src-ios/ios/.xcode.env b/src-ios/ios/.xcode.env new file mode 100644 index 0000000..3d5782c --- /dev/null +++ b/src-ios/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/src-ios/ios/OpenContext.xcodeproj/project.pbxproj b/src-ios/ios/OpenContext.xcodeproj/project.pbxproj new file mode 100644 index 0000000..7052563 --- /dev/null +++ b/src-ios/ios/OpenContext.xcodeproj/project.pbxproj @@ -0,0 +1,549 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; }; + 96905EF65AED1B983A6B3ABC /* libPods-OpenContext.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-OpenContext.a */; }; + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; }; + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; }; + C37330706E6C4384B98FD950 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 902428C887E84A1AAD9E2687 /* noop-file.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 13B07F961A680F5B00A75B9A /* OpenContext.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenContext.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = OpenContext/AppDelegate.h; sourceTree = "<group>"; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = OpenContext/AppDelegate.mm; sourceTree = "<group>"; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = OpenContext/Images.xcassets; sourceTree = "<group>"; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = OpenContext/Info.plist; sourceTree = "<group>"; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = OpenContext/main.m; sourceTree = "<group>"; }; + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-OpenContext.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-OpenContext.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6C2E3173556A471DD304B334 /* Pods-OpenContext.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenContext.debug.xcconfig"; path = "Target Support Files/Pods-OpenContext/Pods-OpenContext.debug.xcconfig"; sourceTree = "<group>"; }; + 7A4D352CD337FB3A3BF06240 /* Pods-OpenContext.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-OpenContext.release.xcconfig"; path = "Target Support Files/Pods-OpenContext/Pods-OpenContext.release.xcconfig"; sourceTree = "<group>"; }; + 902428C887E84A1AAD9E2687 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "OpenContext/noop-file.swift"; sourceTree = "<group>"; }; + 9DBA34B307AE4CC195FB0DA1 /* OpenContext-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "OpenContext-Bridging-Header.h"; path = "OpenContext/OpenContext-Bridging-Header.h"; sourceTree = "<group>"; }; + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = OpenContext/SplashScreen.storyboard; sourceTree = "<group>"; }; + BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-OpenContext/ExpoModulesProvider.swift"; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 96905EF65AED1B983A6B3ABC /* libPods-OpenContext.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 13B07FAE1A68108700A75B9A /* OpenContext */ = { + isa = PBXGroup; + children = ( + BB2F792B24A3F905000567C9 /* Supporting */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 13B07FB71A68108700A75B9A /* main.m */, + AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */, + 902428C887E84A1AAD9E2687 /* noop-file.swift */, + 9DBA34B307AE4CC195FB0DA1 /* OpenContext-Bridging-Header.h */, + ); + name = OpenContext; + sourceTree = "<group>"; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-OpenContext.a */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = "<group>"; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* OpenContext */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + D65327D7A22EEC0BE12398D9 /* Pods */, + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */, + ); + indentWidth = 2; + sourceTree = "<group>"; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* OpenContext.app */, + ); + name = Products; + sourceTree = "<group>"; + }; + 92DBD88DE9BF7D494EA9DA96 /* OpenContext */ = { + isa = PBXGroup; + children = ( + FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */, + ); + name = OpenContext; + sourceTree = "<group>"; + }; + BB2F792B24A3F905000567C9 /* Supporting */ = { + isa = PBXGroup; + children = ( + BB2F792C24A3F905000567C9 /* Expo.plist */, + ); + name = Supporting; + path = OpenContext/Supporting; + sourceTree = "<group>"; + }; + D65327D7A22EEC0BE12398D9 /* Pods */ = { + isa = PBXGroup; + children = ( + 6C2E3173556A471DD304B334 /* Pods-OpenContext.debug.xcconfig */, + 7A4D352CD337FB3A3BF06240 /* Pods-OpenContext.release.xcconfig */, + ); + path = Pods; + sourceTree = "<group>"; + }; + D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = { + isa = PBXGroup; + children = ( + 92DBD88DE9BF7D494EA9DA96 /* OpenContext */, + ); + name = ExpoModulesProviders; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 13B07F861A680F5B00A75B9A /* OpenContext */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "OpenContext" */; + buildPhases = ( + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */, + 7B430A05C9CCE54569A31B46 /* [Expo] Configure project */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, + D0AA5B3601DC2C91ACE146AD /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = OpenContext; + productName = OpenContext; + productReference = 13B07F961A680F5B00A75B9A /* OpenContext.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1130; + TargetAttributes = { + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1250; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "OpenContext" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* OpenContext */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BB2F792D24A3F905000567C9 /* Expo.plist in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + 3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios relative | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; + }; + 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-OpenContext-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 7B430A05C9CCE54569A31B46 /* [Expo] Configure project */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "[Expo] Configure project"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-OpenContext/expo-configure-project.sh\"\n"; + }; + 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-OpenContext/Pods-OpenContext-resources.sh", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/RNCAsyncStorage/RNCAsyncStorage_resources.bundle", + "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/RCTI18nStrings.bundle", + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RNCAsyncStorage_resources.bundle", + "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCTI18nStrings.bundle", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OpenContext/Pods-OpenContext-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + D0AA5B3601DC2C91ACE146AD /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-OpenContext/Pods-OpenContext-frameworks.sh", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/ExpoSQLite/crsqlite.framework/crsqlite", + "${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/crsqlite.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-OpenContext/Pods-OpenContext-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */, + C37330706E6C4384B98FD950 /* noop-file.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-OpenContext.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = OpenContext/OpenContext.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = Q63U7U68Y7; + ENABLE_BITCODE = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "FB_SONARKIT_ENABLED=1", + ); + INFOPLIST_FILE = OpenContext/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = com.contextlab.opencontext; + PRODUCT_NAME = OpenContext; + SWIFT_OBJC_BRIDGING_HEADER = "OpenContext/OpenContext-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-OpenContext.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = OpenContext/OpenContext.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = Q63U7U68Y7; + INFOPLIST_FILE = OpenContext/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = com.contextlab.opencontext; + PRODUCT_NAME = OpenContext; + SWIFT_OBJC_BRIDGING_HEADER = "OpenContext/OpenContext-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = "$(inherited)"; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + USE_HERMES = true; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++20"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\""; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = "$(inherited)"; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + USE_HERMES = true; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "OpenContext" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "OpenContext" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/src-ios/ios/OpenContext.xcodeproj/xcshareddata/xcschemes/OpenContext.xcscheme b/src-ios/ios/OpenContext.xcodeproj/xcshareddata/xcschemes/OpenContext.xcscheme new file mode 100644 index 0000000..1fb859e --- /dev/null +++ b/src-ios/ios/OpenContext.xcodeproj/xcshareddata/xcschemes/OpenContext.xcscheme @@ -0,0 +1,88 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "1130" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + <BuildActionEntries> + <BuildActionEntry + buildForTesting = "YES" + buildForRunning = "YES" + buildForProfiling = "YES" + buildForArchiving = "YES" + buildForAnalyzing = "YES"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "13B07F861A680F5B00A75B9A" + BuildableName = "OpenContext.app" + BlueprintName = "OpenContext" + ReferencedContainer = "container:OpenContext.xcodeproj"> + </BuildableReference> + </BuildActionEntry> + </BuildActionEntries> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + <TestableReference + skipped = "NO"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "00E356ED1AD99517003FC87E" + BuildableName = "OpenContextTests.xctest" + BlueprintName = "OpenContextTests" + ReferencedContainer = "container:OpenContext.xcodeproj"> + </BuildableReference> + </TestableReference> + </Testables> + </TestAction> + <LaunchAction + buildConfiguration = "Release" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "13B07F861A680F5B00A75B9A" + BuildableName = "OpenContext.app" + BlueprintName = "OpenContext" + ReferencedContainer = "container:OpenContext.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + <BuildableProductRunnable + runnableDebuggingMode = "0"> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "13B07F861A680F5B00A75B9A" + BuildableName = "OpenContext.app" + BlueprintName = "OpenContext" + ReferencedContainer = "container:OpenContext.xcodeproj"> + </BuildableReference> + </BuildableProductRunnable> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/src-ios/ios/OpenContext.xcworkspace/contents.xcworkspacedata b/src-ios/ios/OpenContext.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..9695830 --- /dev/null +++ b/src-ios/ios/OpenContext.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "group:OpenContext.xcodeproj"> + </FileRef> + <FileRef + location = "group:Pods/Pods.xcodeproj"> + </FileRef> +</Workspace> diff --git a/src-ios/ios/OpenContext/AppDelegate.h b/src-ios/ios/OpenContext/AppDelegate.h new file mode 100644 index 0000000..1658a43 --- /dev/null +++ b/src-ios/ios/OpenContext/AppDelegate.h @@ -0,0 +1,7 @@ +#import <RCTAppDelegate.h> +#import <UIKit/UIKit.h> +#import <Expo/Expo.h> + +@interface AppDelegate : EXAppDelegateWrapper + +@end diff --git a/src-ios/ios/OpenContext/AppDelegate.mm b/src-ios/ios/OpenContext/AppDelegate.mm new file mode 100644 index 0000000..37d415b --- /dev/null +++ b/src-ios/ios/OpenContext/AppDelegate.mm @@ -0,0 +1,62 @@ +#import "AppDelegate.h" + +#import <React/RCTBundleURLProvider.h> +#import <React/RCTLinkingManager.h> + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.moduleName = @"main"; + + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ + return [self getBundleURL]; +} + +- (NSURL *)getBundleURL +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +// Linking API +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { + return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options]; +} + +// Universal Links +- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler { + BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; + return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken +{ + return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error +{ + return [super application:application didFailToRegisterForRemoteNotificationsWithError:error]; +} + +// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries +- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler +{ + return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; +} + +@end diff --git a/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/Contents.json b/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..5bf45d2 --- /dev/null +++ b/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "icon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "version" : 1, + "author" : "expo" + } +} diff --git a/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/icon.png b/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/icon.png new file mode 100644 index 0000000..c31a043 Binary files /dev/null and b/src-ios/ios/OpenContext/Images.xcassets/AppIcon.appiconset/icon.png differ diff --git a/src-ios/ios/OpenContext/Images.xcassets/Contents.json b/src-ios/ios/OpenContext/Images.xcassets/Contents.json new file mode 100644 index 0000000..ed285c2 --- /dev/null +++ b/src-ios/ios/OpenContext/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "expo" + } +} diff --git a/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/Contents.json b/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/Contents.json new file mode 100644 index 0000000..3cf8489 --- /dev/null +++ b/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images": [ + { + "idiom": "universal", + "filename": "image.png", + "scale": "1x" + }, + { + "idiom": "universal", + "scale": "2x" + }, + { + "idiom": "universal", + "scale": "3x" + } + ], + "info": { + "version": 1, + "author": "expo" + } +} \ No newline at end of file diff --git a/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/image.png b/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/image.png new file mode 100644 index 0000000..33ddf20 Binary files /dev/null and b/src-ios/ios/OpenContext/Images.xcassets/SplashScreenBackground.imageset/image.png differ diff --git a/src-ios/ios/OpenContext/Info.plist b/src-ios/ios/OpenContext/Info.plist new file mode 100644 index 0000000..9b14473 --- /dev/null +++ b/src-ios/ios/OpenContext/Info.plist @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>CADisableMinimumFrameDurationOnPhone</key> + <true/> + <key>CFBundleDevelopmentRegion</key> + <string>$(DEVELOPMENT_LANGUAGE)</string> + <key>CFBundleDisplayName</key> + <string>OpenContext</string> + <key>CFBundleExecutable</key> + <string>$(EXECUTABLE_NAME)</string> + <key>CFBundleIdentifier</key> + <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> + <key>CFBundleInfoDictionaryVersion</key> + <string>6.0</string> + <key>CFBundleName</key> + <string>$(PRODUCT_NAME)</string> + <key>CFBundlePackageType</key> + <string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string> + <key>CFBundleShortVersionString</key> + <string>0.1.0</string> + <key>CFBundleSignature</key> + <string>????</string> + <key>CFBundleURLTypes</key> + <array> + <dict> + <key>CFBundleURLSchemes</key> + <array> + <string>com.contextlab.opencontext</string> + </array> + </dict> + </array> + <key>CFBundleVersion</key> + <string>1</string> + <key>LSRequiresIPhoneOS</key> + <true/> + <key>NSAppTransportSecurity</key> + <dict> + <key>NSAllowsArbitraryLoads</key> + <false/> + <key>NSAllowsLocalNetworking</key> + <true/> + </dict> + <key>NSCameraUsageDescription</key> + <string>Allow $(PRODUCT_NAME) to access your camera</string> + <key>NSMicrophoneUsageDescription</key> + <string>Allow $(PRODUCT_NAME) to access your microphone</string> + <key>NSPhotoLibraryUsageDescription</key> + <string>Allow OpenContext to access your photos to attach images.</string> + <key>UILaunchStoryboardName</key> + <string>SplashScreen</string> + <key>UIRequiredDeviceCapabilities</key> + <array> + <string>armv7</string> + </array> + <key>UIRequiresFullScreen</key> + <false/> + <key>UIStatusBarStyle</key> + <string>UIStatusBarStyleDefault</string> + <key>UISupportedInterfaceOrientations</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + </array> + <key>UISupportedInterfaceOrientations~ipad</key> + <array> + <string>UIInterfaceOrientationPortrait</string> + <string>UIInterfaceOrientationPortraitUpsideDown</string> + <string>UIInterfaceOrientationLandscapeLeft</string> + <string>UIInterfaceOrientationLandscapeRight</string> + </array> + <key>UIUserInterfaceStyle</key> + <string>Light</string> + <key>UIViewControllerBasedStatusBarAppearance</key> + <false/> + </dict> +</plist> diff --git a/src-ios/ios/OpenContext/OpenContext-Bridging-Header.h b/src-ios/ios/OpenContext/OpenContext-Bridging-Header.h new file mode 100644 index 0000000..e11d920 --- /dev/null +++ b/src-ios/ios/OpenContext/OpenContext-Bridging-Header.h @@ -0,0 +1,3 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// diff --git a/src-ios/ios/OpenContext/OpenContext.entitlements b/src-ios/ios/OpenContext/OpenContext.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/src-ios/ios/OpenContext/OpenContext.entitlements @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict/> +</plist> diff --git a/src-ios/ios/OpenContext/SplashScreen.storyboard b/src-ios/ios/OpenContext/SplashScreen.storyboard new file mode 100644 index 0000000..1227a2b --- /dev/null +++ b/src-ios/ios/OpenContext/SplashScreen.storyboard @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="16096" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="EXPO-VIEWCONTROLLER-1"> + <device id="retina5_5" orientation="portrait" appearance="light"/> + <dependencies> + <deployment identifier="iOS"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="16087"/> + <capability name="Safe area layout guides" minToolsVersion="9.0"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <scenes> + <scene sceneID="EXPO-SCENE-1"> + <objects> + <viewController storyboardIdentifier="SplashScreenViewController" id="EXPO-VIEWCONTROLLER-1" sceneMemberID="viewController"> + <view key="view" userInteractionEnabled="NO" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="EXPO-ContainerView" userLabel="ContainerView"> + <rect key="frame" x="0.0" y="0.0" width="414" height="736"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> + <subviews> + <imageView userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" insetsLayoutMarginsFromSafeArea="NO" image="SplashScreenBackground" translatesAutoresizingMaskIntoConstraints="NO" id="EXPO-SplashScreenBackground" userLabel="SplashScreenBackground"> + <rect key="frame" x="0.0" y="0.0" width="414" height="736"/> + </imageView> + </subviews> + <constraints> + <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="1gX-mQ-vu6"/> + <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="6tX-OG-Sck"/> + <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="ABX-8g-7v4"/> + <constraint firstItem="EXPO-SplashScreenBackground" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="jkI-2V-eW5"/> + <constraint firstItem="EXPO-SplashScreen" firstAttribute="top" secondItem="EXPO-ContainerView" secondAttribute="top" id="2VS-Uz-0LU"/> + <constraint firstItem="EXPO-SplashScreen" firstAttribute="leading" secondItem="EXPO-ContainerView" secondAttribute="leading" id="LhH-Ei-DKo"/> + <constraint firstItem="EXPO-SplashScreen" firstAttribute="trailing" secondItem="EXPO-ContainerView" secondAttribute="trailing" id="I6l-TP-6fn"/> + <constraint firstItem="EXPO-SplashScreen" firstAttribute="bottom" secondItem="EXPO-ContainerView" secondAttribute="bottom" id="nbp-HC-eaG"/> + </constraints> + <viewLayoutGuide key="safeArea" id="Rmq-lb-GrQ"/> + </view> + </viewController> + <placeholder placeholderIdentifier="IBFirstResponder" id="EXPO-PLACEHOLDER-1" userLabel="First Responder" sceneMemberID="firstResponder"/> + </objects> + <point key="canvasLocation" x="140.625" y="129.4921875"/> + </scene> + </scenes> + <resources> + <image name="SplashScreenBackground" width="1" height="1"/> + </resources> +</document> \ No newline at end of file diff --git a/src-ios/ios/OpenContext/Supporting/Expo.plist b/src-ios/ios/OpenContext/Supporting/Expo.plist new file mode 100644 index 0000000..540b746 --- /dev/null +++ b/src-ios/ios/OpenContext/Supporting/Expo.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>EXUpdatesCheckOnLaunch</key> + <string>ALWAYS</string> + <key>EXUpdatesEnabled</key> + <false/> + <key>EXUpdatesLaunchWaitMs</key> + <integer>0</integer> + <key>EXUpdatesSDKVersion</key> + <string>50.0.0</string> + </dict> +</plist> \ No newline at end of file diff --git a/src-ios/ios/OpenContext/main.m b/src-ios/ios/OpenContext/main.m new file mode 100644 index 0000000..25181b6 --- /dev/null +++ b/src-ios/ios/OpenContext/main.m @@ -0,0 +1,10 @@ +#import <UIKit/UIKit.h> + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} + diff --git a/src-ios/ios/OpenContext/noop-file.swift b/src-ios/ios/OpenContext/noop-file.swift new file mode 100644 index 0000000..b2ffafb --- /dev/null +++ b/src-ios/ios/OpenContext/noop-file.swift @@ -0,0 +1,4 @@ +// +// @generated +// A blank Swift file must be created for native modules with Swift files to work correctly. +// diff --git a/src-ios/ios/Podfile b/src-ios/ios/Podfile new file mode 100644 index 0000000..78cc66c --- /dev/null +++ b/src-ios/ios/Podfile @@ -0,0 +1,90 @@ +require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking") +require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods") + +require 'json' +podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {} + +ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0' +ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR'] + +platform :ios, podfile_properties['ios.deploymentTarget'] || '13.4' +install! 'cocoapods', + :deterministic_uuids => false + +prepare_react_native_project! + +# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. +# because `react-native-flipper` depends on (FlipperKit,...), which will be excluded. To fix this, +# you can also exclude `react-native-flipper` in `react-native.config.js` +# +# ```js +# module.exports = { +# dependencies: { +# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), +# } +# } +# ``` +flipper_config = FlipperConfiguration.disabled +if ENV['NO_FLIPPER'] == '1' then + # Explicitly disabled through environment variables + flipper_config = FlipperConfiguration.disabled +elsif podfile_properties.key?('ios.flipper') then + # Configure Flipper in Podfile.properties.json + if podfile_properties['ios.flipper'] == 'true' then + flipper_config = FlipperConfiguration.enabled(["Debug", "Release"]) + elsif podfile_properties['ios.flipper'] != 'false' then + flipper_config = FlipperConfiguration.enabled(["Debug", "Release"], { 'Flipper' => podfile_properties['ios.flipper'] }) + end +end + +target 'OpenContext' do + use_expo_modules! + config = use_native_modules! + + use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks'] + use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS'] + + use_react_native!( + :path => config[:reactNativePath], + :hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes', + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/..", + # Note that if you have use_frameworks! enabled, Flipper will not work if enabled + :flipper_configuration => flipper_config + ) + + post_install do |installer| + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false + ) + + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + if config.name == 'Release' + config.build_settings['DEBUG_INFORMATION_FORMAT'] = 'dwarf-with-dsym' + end + end + end + + # This is necessary for Xcode 14, because it signs resource bundles by default + # when building for devices. + installer.target_installation_results.pod_target_installation_results + .each do |pod_name, target_installation_result| + target_installation_result.resource_bundle_targets.each do |resource_bundle_target| + resource_bundle_target.build_configurations.each do |config| + config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO' + end + end + end + end + + post_integrate do |installer| + begin + expo_patch_react_imports!(installer) + rescue => e + Pod::UI.warn e + end + end +end diff --git a/src-ios/ios/Podfile.properties.json b/src-ios/ios/Podfile.properties.json new file mode 100644 index 0000000..de9f7b7 --- /dev/null +++ b/src-ios/ios/Podfile.properties.json @@ -0,0 +1,4 @@ +{ + "expo.jsEngine": "hermes", + "EX_DEV_CLIENT_NETWORK_INSPECTOR": "true" +} diff --git a/src-ios/package-lock.json b/src-ios/package-lock.json new file mode 100644 index 0000000..0cb6e3c --- /dev/null +++ b/src-ios/package-lock.json @@ -0,0 +1,14358 @@ +{ + "name": "opencontext-ios", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "opencontext-ios", + "version": "0.1.0", + "dependencies": { + "@react-native-async-storage/async-storage": "^1.23.1", + "@react-navigation/bottom-tabs": "^6.6.1", + "@react-navigation/native": "^6.1.17", + "@react-navigation/native-stack": "^6.10.0", + "expo": "~50.0.0", + "expo-file-system": "~16.0.5", + "expo-image-picker": "~14.7.1", + "expo-linear-gradient": "~12.7.1", + "expo-sqlite": "~13.4.0", + "i18next": "^23.11.5", + "react": "18.2.0", + "react-i18next": "^14.1.2", + "react-native": "0.73.6", + "react-native-gesture-handler": "~2.14.0", + "react-native-safe-area-context": "4.8.2", + "react-native-screens": "~3.29.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", + "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz", + "integrity": "sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-decorators": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-default-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.27.1.tgz", + "integrity": "sha512-hjlsMBl1aJc5lp8MoCDEZCiYzlgdRAShOjAfRw6X+GlpLpUPU7c3XNLsKFZbQk/1cRzBlJ7CXg3xJAJMrFa1Uw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-default-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.27.1.tgz", + "integrity": "sha512-eBC/3KSekshx19+N40MzjWqJd7KTEdOoLesAfa4IDFI8eRz5a47i5Oszus6zG/cwIXN63YhgLOMSSNJx49sENg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-flow": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.5.tgz", + "integrity": "sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-flow": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.27.1.tgz", + "integrity": "sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-flow-strip-types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.28.3.tgz", + "integrity": "sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.6", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@egjs/hammerjs": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@egjs/hammerjs/-/hammerjs-2.0.17.tgz", + "integrity": "sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==", + "license": "MIT", + "dependencies": { + "@types/hammerjs": "^2.0.36" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@expo/bunyan": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@expo/bunyan/-/bunyan-4.0.1.tgz", + "integrity": "sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==", + "license": "MIT", + "dependencies": { + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@expo/cli": { + "version": "0.17.13", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.17.13.tgz", + "integrity": "sha512-n13yxOmI3I0JidzMdFCH68tYKGDtK4XlDFk1vysZX7AIRKeDVRsSbHhma5jCla2bDt25RKmJBHA9KtzielwzAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/code-signing-certificates": "0.0.5", + "@expo/config": "~8.5.0", + "@expo/config-plugins": "~7.9.0", + "@expo/devcert": "^1.0.0", + "@expo/env": "~0.2.2", + "@expo/image-utils": "^0.4.0", + "@expo/json-file": "^8.2.37", + "@expo/metro-config": "0.17.8", + "@expo/osascript": "^2.0.31", + "@expo/package-manager": "^1.1.1", + "@expo/plist": "^0.1.0", + "@expo/prebuild-config": "6.8.1", + "@expo/rudder-sdk-node": "1.1.1", + "@expo/spawn-async": "1.5.0", + "@expo/xcpretty": "^4.3.0", + "@react-native/dev-middleware": "^0.73.6", + "@urql/core": "2.3.6", + "@urql/exchange-retry": "0.3.0", + "accepts": "^1.3.8", + "arg": "5.0.2", + "better-opn": "~3.0.2", + "bplist-parser": "^0.3.1", + "cacache": "^15.3.0", + "chalk": "^4.0.0", + "ci-info": "^3.3.0", + "connect": "^3.7.0", + "debug": "^4.3.4", + "env-editor": "^0.4.1", + "find-yarn-workspace-root": "~2.0.0", + "form-data": "^3.0.1", + "freeport-async": "2.0.0", + "fs-extra": "~8.1.0", + "getenv": "^1.0.0", + "glob": "^7.1.7", + "graphql": "15.8.0", + "graphql-tag": "^2.10.1", + "https-proxy-agent": "^5.0.1", + "internal-ip": "4.3.0", + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1", + "js-yaml": "^3.13.1", + "json-schema-deref-sync": "^0.13.0", + "lodash.debounce": "^4.0.8", + "md5hex": "^1.0.0", + "minimatch": "^3.0.4", + "minipass": "3.3.6", + "node-fetch": "^2.6.7", + "node-forge": "^1.3.1", + "npm-package-arg": "^7.0.0", + "open": "^8.3.0", + "ora": "3.4.0", + "picomatch": "^3.0.1", + "pretty-bytes": "5.6.0", + "progress": "2.0.3", + "prompts": "^2.3.2", + "qrcode-terminal": "0.11.0", + "require-from-string": "^2.0.2", + "requireg": "^0.2.2", + "resolve": "^1.22.2", + "resolve-from": "^5.0.0", + "resolve.exports": "^2.0.2", + "semver": "^7.5.3", + "send": "^0.18.0", + "slugify": "^1.3.4", + "source-map-support": "~0.5.21", + "stacktrace-parser": "^0.1.10", + "structured-headers": "^0.4.1", + "tar": "^6.0.5", + "temp-dir": "^2.0.0", + "tempy": "^0.7.1", + "terminal-link": "^2.1.1", + "text-table": "^0.2.0", + "url-join": "4.0.0", + "wrap-ansi": "^7.0.0", + "ws": "^8.12.1" + }, + "bin": { + "expo-internal": "build/bin/cli" + } + }, + "node_modules/@expo/code-signing-certificates": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@expo/code-signing-certificates/-/code-signing-certificates-0.0.5.tgz", + "integrity": "sha512-BNhXkY1bblxKZpltzAx98G2Egj9g1Q+JRcvR7E99DOj862FTCX+ZPsAUtPTr7aHxwtrL7+fL3r0JSmM9kBm+Bw==", + "license": "MIT", + "dependencies": { + "node-forge": "^1.2.1", + "nullthrows": "^1.1.1" + } + }, + "node_modules/@expo/config": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-8.5.6.tgz", + "integrity": "sha512-wF5awSg6MNn1cb1lIgjnhOn5ov2TEUTnkAVCsOl0QqDwcP+YIerteSFwjn9V52UZvg58L+LKxpCuGbw5IHavbg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "@expo/config-plugins": "~7.9.0", + "@expo/config-types": "^50.0.0", + "@expo/json-file": "^8.2.37", + "getenv": "^1.0.0", + "glob": "7.1.6", + "require-from-string": "^2.0.2", + "resolve-from": "^5.0.0", + "semver": "7.5.3", + "slugify": "^1.3.4", + "sucrase": "3.34.0" + } + }, + "node_modules/@expo/config-plugins": { + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-7.9.2.tgz", + "integrity": "sha512-sRU/OAp7kJxrCUiCTUZqvPMKPdiN1oTmNfnbkG4oPdfWQTpid3jyCH7ZxJEN5SI6jrY/ZsK5B/JPgjDUhuWLBQ==", + "license": "MIT", + "dependencies": { + "@expo/config-types": "^50.0.0-alpha.1", + "@expo/fingerprint": "^0.6.0", + "@expo/json-file": "~8.3.0", + "@expo/plist": "^0.1.0", + "@expo/sdk-runtime-versions": "^1.0.0", + "@react-native/normalize-color": "^2.0.0", + "chalk": "^4.1.2", + "debug": "^4.3.1", + "find-up": "~5.0.0", + "getenv": "^1.0.0", + "glob": "7.1.6", + "resolve-from": "^5.0.0", + "semver": "^7.5.3", + "slash": "^3.0.0", + "slugify": "^1.6.6", + "xcode": "^3.0.1", + "xml2js": "0.6.0" + } + }, + "node_modules/@expo/config-plugins/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config-types": { + "version": "50.0.1", + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-50.0.1.tgz", + "integrity": "sha512-EZHMgzkWRB9SMHO1e9m8s+OMahf92XYTnsCFjxhSfcDrcEoSdFPyJWDJVloHZPMGhxns7Fi2+A+bEVN/hD4NKA==", + "license": "MIT" + }, + "node_modules/@expo/config/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@expo/config/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/config/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@expo/devcert": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", + "integrity": "sha512-qC4eaxmKMTmJC2ahwyui6ud8f3W60Ss7pMkpBq40Hu3zyiAaugPXnZ24145U7K36qO9UHdZUVxsCvIpz2RYYCA==", + "license": "MIT", + "dependencies": { + "@expo/sudo-prompt": "^9.3.1", + "debug": "^3.1.0" + } + }, + "node_modules/@expo/devcert/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@expo/env": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-0.2.3.tgz", + "integrity": "sha512-a+uJ/e6MAVxPVVN/HbXU5qxzdqrqDwNQYxCfxtAufgmd5VZj54e5f3TJA3LEEUW3pTSZR8xK0H0EtVN297AZnw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "debug": "^4.3.4", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "getenv": "^1.0.0" + } + }, + "node_modules/@expo/fingerprint": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.6.1.tgz", + "integrity": "sha512-ggLn6unI6qowlA1FihdQwPpLn16VJulYkvYAEL50gaqVahfNEglRQMSH2giZzjD0d6xq2/EQuUdFyHaJfyJwOQ==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.5.0", + "chalk": "^4.1.2", + "debug": "^4.3.4", + "find-up": "^5.0.0", + "minimatch": "^3.0.4", + "p-limit": "^3.1.0", + "resolve-from": "^5.0.0" + }, + "bin": { + "fingerprint": "bin/cli.js" + } + }, + "node_modules/@expo/image-utils": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.4.2.tgz", + "integrity": "sha512-CxP+1QXgRXsNnmv2FAUA2RWwK6kNBFg4QEmVXn2K9iLoEAI+i+1IQXcUgc+J7nTJl9pO7FIu2gIiEYGYffjLWQ==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "1.5.0", + "chalk": "^4.0.0", + "fs-extra": "9.0.0", + "getenv": "^1.0.0", + "jimp-compact": "0.16.1", + "node-fetch": "^2.6.0", + "parse-png": "^2.1.0", + "resolve-from": "^5.0.0", + "semver": "7.3.2", + "tempy": "0.3.0" + } + }, + "node_modules/@expo/image-utils/node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/fs-extra": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/image-utils/node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/image-utils/node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/tempy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.3.0.tgz", + "integrity": "sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ==", + "license": "MIT", + "dependencies": { + "temp-dir": "^1.0.0", + "type-fest": "^0.3.1", + "unique-string": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/image-utils/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/image-utils/node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/image-utils/node_modules/universalify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/json-file": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-8.3.3.tgz", + "integrity": "sha512-eZ5dld9AD0PrVRiIWpRkm5aIoWBw3kAyd8VkuWEy92sEthBKDDDHAnK2a0dw0Eil6j7rK7lS/Qaq/Zzngv2h5A==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.2", + "write-file-atomic": "^2.3.0" + } + }, + "node_modules/@expo/metro-config": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-0.17.8.tgz", + "integrity": "sha512-XNjI5Q5bW3k2ieNtQBSX9BnIysRxG4UyNsaWcysv3AzY+rahay6fAp5xzJey8xBOlzs9u7H4AdMoeJsUje3lcQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "@expo/config": "~8.5.0", + "@expo/env": "~0.2.2", + "@expo/json-file": "~8.3.0", + "@expo/spawn-async": "^1.7.2", + "babel-preset-fbjs": "^3.4.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "find-yarn-workspace-root": "~2.0.0", + "fs-extra": "^9.1.0", + "getenv": "^1.0.0", + "glob": "^7.2.3", + "jsc-safe-url": "^0.2.4", + "lightningcss": "~1.19.0", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0", + "sucrase": "3.34.0" + }, + "peerDependencies": { + "@react-native/babel-preset": "*" + } + }, + "node_modules/@expo/metro-config/node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/metro-config/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/metro-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/metro-config/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/metro-config/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/metro-config/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/metro-config/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/metro-config/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/metro-config/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/osascript": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.3.8.tgz", + "integrity": "sha512-/TuOZvSG7Nn0I8c+FcEaoHeBO07yu6vwDgk7rZVvAXoeAK5rkA09jRyjYsZo+0tMEFaToBeywA6pj50Mb3ny9w==", + "license": "MIT", + "dependencies": { + "@expo/spawn-async": "^1.7.2", + "exec-async": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/osascript/node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/osascript/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/osascript/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/osascript/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/osascript/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/osascript/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/package-manager": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.9.9.tgz", + "integrity": "sha512-Nv5THOwXzPprMJwbnXU01iXSrCp3vJqly9M4EJ2GkKko9Ifer2ucpg7x6OUsE09/lw+npaoUnHMXwkw7gcKxlg==", + "license": "MIT", + "dependencies": { + "@expo/json-file": "^10.0.8", + "@expo/spawn-async": "^1.7.2", + "chalk": "^4.0.0", + "npm-package-arg": "^11.0.0", + "ora": "^3.4.0", + "resolve-workspace-root": "^2.0.0" + } + }, + "node_modules/@expo/package-manager/node_modules/@expo/json-file": { + "version": "10.0.8", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.8.tgz", + "integrity": "sha512-9LOTh1PgKizD1VXfGQ88LtDH0lRwq9lsTb4aichWTWSWqy3Ugfkhfm3BhzBIkJJfQQ5iJu3m/BoRlEIjoCGcnQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "~7.10.4", + "json5": "^2.2.3" + } + }, + "node_modules/@expo/package-manager/node_modules/@expo/spawn-async": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.7.2.tgz", + "integrity": "sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/package-manager/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/package-manager/node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@expo/package-manager/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==", + "license": "ISC" + }, + "node_modules/@expo/package-manager/node_modules/npm-package-arg": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz", + "integrity": "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@expo/package-manager/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/package-manager/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/package-manager/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@expo/package-manager/node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@expo/package-manager/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@expo/plist": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.1.3.tgz", + "integrity": "sha512-GW/7hVlAylYg1tUrEASclw1MMk9FP4ZwyFAY/SUTJIhPDQHtfOlXREyWV3hhrHdX/K+pS73GNgdfT6E/e+kBbg==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "~0.7.7", + "base64-js": "^1.2.3", + "xmlbuilder": "^14.0.0" + } + }, + "node_modules/@expo/prebuild-config": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-6.8.1.tgz", + "integrity": "sha512-ptK9e0dcj1eYlAWV+fG+QkuAWcLAT1AmtEbj++tn7ZjEj8+LkXRM73LCOEGaF0Er8i8ZWNnaVsgGW4vjgP5ZsA==", + "license": "MIT", + "dependencies": { + "@expo/config": "~8.5.0", + "@expo/config-plugins": "~7.9.0", + "@expo/config-types": "^50.0.0-alpha.1", + "@expo/image-utils": "^0.4.0", + "@expo/json-file": "^8.2.37", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "7.5.3", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo-modules-autolinking": ">=0.8.1" + } + }, + "node_modules/@expo/prebuild-config/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@expo/prebuild-config/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@expo/prebuild-config/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@expo/prebuild-config/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/@expo/rudder-sdk-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@expo/rudder-sdk-node/-/rudder-sdk-node-1.1.1.tgz", + "integrity": "sha512-uy/hS/awclDJ1S88w9UGpc6Nm9XnNUjzOAAib1A3PVAnGQIwebg8DpFqOthFBTlZxeuV/BKbZ5jmTbtNZkp1WQ==", + "license": "MIT", + "dependencies": { + "@expo/bunyan": "^4.0.0", + "@segment/loosely-validate-event": "^2.0.0", + "fetch-retry": "^4.1.1", + "md5": "^2.2.1", + "node-fetch": "^2.6.1", + "remove-trailing-slash": "^0.1.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@expo/sdk-runtime-versions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@expo/sdk-runtime-versions/-/sdk-runtime-versions-1.0.0.tgz", + "integrity": "sha512-Doz2bfiPndXYFPMRwPyGa1k5QaKDVpY806UJj570epIiMzWaYyCtobasyfC++qfIXVb5Ocy7r3tP9d62hAQ7IQ==", + "license": "MIT" + }, + "node_modules/@expo/spawn-async": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@expo/spawn-async/-/spawn-async-1.5.0.tgz", + "integrity": "sha512-LB7jWkqrHo+5fJHNrLAFdimuSXQ2MQ4lA7SQW5bf/HbsXuV2VrT/jN/M8f/KoWt0uJMGN4k/j7Opx4AvOOxSew==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/sudo-prompt": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@expo/sudo-prompt/-/sudo-prompt-9.3.2.tgz", + "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", + "license": "MIT" + }, + "node_modules/@expo/vector-icons": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-14.1.0.tgz", + "integrity": "sha512-7T09UE9h8QDTsUeMGymB4i+iqvtEeaO5VvUjryFB4tugDTG/bkzViWA74hm5pfjjDEhYMXWaX112mcvhccmIwQ==", + "license": "MIT", + "peerDependencies": { + "expo-font": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/@expo/websql": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@expo/websql/-/websql-1.0.1.tgz", + "integrity": "sha512-H9/t1V7XXyKC343FJz/LwaVBfDhs6IqhDtSYWpt8LNSQDVjf5NvVJLc5wp+KCpRidZx8+0+YeHJN45HOXmqjFA==", + "license": "Apache-2.0", + "dependencies": { + "argsarray": "^0.0.1", + "immediate": "^3.2.2", + "noop-fn": "^1.0.0", + "pouchdb-collections": "^1.0.1", + "tiny-queue": "^0.2.1" + } + }, + "node_modules/@expo/xcpretty": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.3.2.tgz", + "integrity": "sha512-ReZxZ8pdnoI3tP/dNnJdnmAk7uLT4FjsKDGW7YeDdvdOMz2XCQSmSCM9IWlrXuWtMF9zeSB6WJtEhCQ41gQOfw==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/code-frame": "7.10.4", + "chalk": "^4.1.0", + "find-up": "^5.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "excpretty": "build/cli.js" + } + }, + "node_modules/@expo/xcpretty/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==", + "license": "Python-2.0" + }, + "node_modules/@expo/xcpretty/node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "license": "MIT" + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@isaacs/ttlcache": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", + "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@jest/create-cache-key-function": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", + "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", + "license": "ISC", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "license": "MIT", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@react-native-async-storage/async-storage": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz", + "integrity": "sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==", + "license": "MIT", + "dependencies": { + "merge-options": "^3.0.4" + }, + "peerDependencies": { + "react-native": "^0.0.0-0 || >=0.60 <1.0" + } + }, + "node_modules/@react-native-community/cli": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.6.tgz", + "integrity": "sha512-647OSi6xBb8FbwFqX9zsJxOzu685AWtrOUWHfOkbKD+5LOpGORw+GQo0F9rWZnB68rLQyfKUZWJeaD00pGv5fw==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-clean": "12.3.6", + "@react-native-community/cli-config": "12.3.6", + "@react-native-community/cli-debugger-ui": "12.3.6", + "@react-native-community/cli-doctor": "12.3.6", + "@react-native-community/cli-hermes": "12.3.6", + "@react-native-community/cli-plugin-metro": "12.3.6", + "@react-native-community/cli-server-api": "12.3.6", + "@react-native-community/cli-tools": "12.3.6", + "@react-native-community/cli-types": "12.3.6", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "deepmerge": "^4.3.0", + "execa": "^5.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "graceful-fs": "^4.1.3", + "prompts": "^2.4.2", + "semver": "^7.5.2" + }, + "bin": { + "react-native": "build/bin.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native-community/cli-clean": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.6.tgz", + "integrity": "sha512-gUU29ep8xM0BbnZjwz9MyID74KKwutq9x5iv4BCr2im6nly4UMf1B1D+V225wR7VcDGzbgWjaezsJShLLhC5ig==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "execa": "^5.0.0" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-clean/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-config": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.6.tgz", + "integrity": "sha512-JGWSYQ9EAK6m2v0abXwFLEfsqJ1zkhzZ4CV261QZF9MoUNB6h57a274h1MLQR9mG6Tsh38wBUuNfEPUvS1vYew==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "cosmiconfig": "^5.1.0", + "deepmerge": "^4.3.0", + "glob": "^7.1.3", + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli-debugger-ui": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.6.tgz", + "integrity": "sha512-SjUKKsx5FmcK9G6Pb6UBFT0s9JexVStK5WInmANw75Hm7YokVvHEgtprQDz2Uvy5znX5g2ujzrkIU//T15KQzA==", + "license": "MIT", + "dependencies": { + "serve-static": "^1.13.1" + } + }, + "node_modules/@react-native-community/cli-doctor": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.6.tgz", + "integrity": "sha512-fvBDv2lTthfw4WOQKkdTop2PlE9GtfrlNnpjB818MhcdEnPjfQw5YaTUcnNEGsvGomdCs1MVRMgYXXwPSN6OvQ==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-config": "12.3.6", + "@react-native-community/cli-platform-android": "12.3.6", + "@react-native-community/cli-platform-ios": "12.3.6", + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "command-exists": "^1.2.8", + "deepmerge": "^4.3.0", + "envinfo": "^7.10.0", + "execa": "^5.0.0", + "hermes-profile-transformer": "^0.0.6", + "node-stream-zip": "^1.9.1", + "ora": "^5.4.1", + "semver": "^7.5.2", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1", + "yaml": "^2.2.1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-doctor/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-hermes": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.6.tgz", + "integrity": "sha512-sNGwfOCl8OAIjWCkwuLpP8NZbuO0dhDI/2W7NeOGDzIBsf4/c4MptTrULWtGIH9okVPLSPX0NnRyGQ+mSwWyuQ==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-platform-android": "12.3.6", + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "hermes-profile-transformer": "^0.0.6" + } + }, + "node_modules/@react-native-community/cli-platform-android": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.6.tgz", + "integrity": "sha512-DeDDAB8lHpuGIAPXeeD9Qu2+/wDTFPo99c8uSW49L0hkmZJixzvvvffbGQAYk32H0TmaI7rzvzH+qzu7z3891g==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.2.4", + "glob": "^7.1.3", + "logkitty": "^0.7.1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-android/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-platform-ios": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.6.tgz", + "integrity": "sha512-3eZ0jMCkKUO58wzPWlvAPRqezVKm9EPZyaPyHbRPWU8qw7JqkvnRlWIaYDGpjCJgVW4k2hKsEursLtYKb188tg==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-tools": "12.3.6", + "chalk": "^4.1.2", + "execa": "^5.0.0", + "fast-xml-parser": "^4.0.12", + "glob": "^7.1.3", + "ora": "^5.4.1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-platform-ios/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli-plugin-metro": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.6.tgz", + "integrity": "sha512-3jxSBQt4fkS+KtHCPSyB5auIT+KKIrPCv9Dk14FbvOaEh9erUWEm/5PZWmtboW1z7CYeNbFMeXm9fM2xwtVOpg==", + "license": "MIT" + }, + "node_modules/@react-native-community/cli-server-api": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.6.tgz", + "integrity": "sha512-80NIMzo8b2W+PL0Jd7NjiJW9mgaT8Y8wsIT/lh6mAvYH7mK0ecDJUYUTAAv79Tbo1iCGPAr3T295DlVtS8s4yQ==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-debugger-ui": "12.3.6", + "@react-native-community/cli-tools": "12.3.6", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.1", + "nocache": "^3.0.1", + "pretty-format": "^26.6.2", + "serve-static": "^1.13.1", + "ws": "^7.5.1" + } + }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@react-native-community/cli-tools": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.6.tgz", + "integrity": "sha512-FPEvZn19UTMMXUp/piwKZSh8cMEfO8G3KDtOwo53O347GTcwNrKjgZGtLSPELBX2gr+YlzEft3CoRv2Qmo83fQ==", + "license": "MIT", + "dependencies": { + "appdirsjs": "^1.2.4", + "chalk": "^4.1.2", + "find-up": "^5.0.0", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "ora": "^5.4.1", + "semver": "^7.5.2", + "shell-quote": "^1.7.3", + "sudo-prompt": "^9.0.0" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-tools/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli-types": { + "version": "12.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.6.tgz", + "integrity": "sha512-xPqTgcUtZowQ8WKOkI9TLGBwH2bGggOC4d2FFaIRST3gTcjrEeGRNeR5aXCzJFIgItIft8sd7p2oKEdy90+01Q==", + "license": "MIT", + "dependencies": { + "joi": "^17.2.1" + } + }, + "node_modules/@react-native-community/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/@react-native-community/cli/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native-community/cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native-community/cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native-community/cli/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native/assets-registry": { + "version": "0.73.1", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.73.1.tgz", + "integrity": "sha512-2FgAbU7uKM5SbbW9QptPPZx8N9Ke2L7bsHb+EhAanZjFZunA9PaYtyjUQ1s7HD+zDVqOQIvjkpXSv7Kejd2tqg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/babel-plugin-codegen": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.1.tgz", + "integrity": "sha512-VPj8O3pG1ESjZho9WVKxqiuryrotAECPHGF5mx46zLUYNTWR5u9OMUXYk7LeLy+JLWdGEZ2Gn3KoXeFZbuqE+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/traverse": "^7.25.3", + "@react-native/codegen": "0.83.1" + }, + "engines": { + "node": ">= 20.19.4" + } + }, + "node_modules/@react-native/babel-preset": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.1.tgz", + "integrity": "sha512-xI+tbsD4fXcI6PVU4sauRCh0a5fuLQC849SINmU2J5wP8kzKu4Ye0YkGjUW3mfGrjaZcjkWmF6s33jpyd3gdTw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.25.2", + "@babel/plugin-transform-react-jsx-self": "^7.24.7", + "@babel/plugin-transform-react-jsx-source": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.25.2", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/template": "^7.25.0", + "@react-native/babel-plugin-codegen": "0.83.1", + "babel-plugin-syntax-hermes-parser": "0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/codegen": { + "version": "0.83.1", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.1.tgz", + "integrity": "sha512-FpRxenonwH+c2a5X5DZMKUD7sCudHxB3eSQPgV9R+uxd28QWslyAWrpnJM/Az96AEksHnymDzEmzq2HLX5nb+g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/core": "^7.25.2", + "@babel/parser": "^7.25.3", + "glob": "^7.1.1", + "hermes-parser": "0.32.0", + "invariant": "^2.2.4", + "nullthrows": "^1.1.1", + "yargs": "^17.6.2" + }, + "engines": { + "node": ">= 20.19.4" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/community-cli-plugin": { + "version": "0.73.17", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.17.tgz", + "integrity": "sha512-F3PXZkcHg+1ARIr6FRQCQiB7ZAA+MQXGmq051metRscoLvgYJwj7dgC8pvgy0kexzUkHu5BNKrZeySzUft3xuQ==", + "license": "MIT", + "dependencies": { + "@react-native-community/cli-server-api": "12.3.6", + "@react-native-community/cli-tools": "12.3.6", + "@react-native/dev-middleware": "0.73.8", + "@react-native/metro-babel-transformer": "0.73.15", + "chalk": "^4.0.0", + "execa": "^5.1.1", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", + "node-fetch": "^2.2.0", + "readline": "^1.3.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/community-cli-plugin/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/community-cli-plugin/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-native/debugger-frontend": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.73.3.tgz", + "integrity": "sha512-RgEKnWuoo54dh7gQhV7kvzKhXZEhpF9LlMdZolyhGxHsBqZ2gXdibfDlfcARFFifPIiaZ3lXuOVVa4ei+uPgTw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware": { + "version": "0.73.8", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.8.tgz", + "integrity": "sha512-oph4NamCIxkMfUL/fYtSsE+JbGOnrlawfQ0kKtDQ5xbOjPKotKoXqrs1eGwozNKv7FfQ393stk1by9a6DyASSg==", + "license": "MIT", + "dependencies": { + "@isaacs/ttlcache": "^1.4.1", + "@react-native/debugger-frontend": "0.73.3", + "chrome-launcher": "^0.15.2", + "chromium-edge-launcher": "^1.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "node-fetch": "^2.2.0", + "open": "^7.0.3", + "serve-static": "^1.13.1", + "temp-dir": "^2.0.0", + "ws": "^6.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/@react-native/gradle-plugin": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.73.4.tgz", + "integrity": "sha512-PMDnbsZa+tD55Ug+W8CfqXiGoGneSSyrBZCMb5JfiB3AFST3Uj5e6lw8SgI/B6SKZF7lG0BhZ6YHZsRZ5MlXmg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/js-polyfills": { + "version": "0.73.1", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.73.1.tgz", + "integrity": "sha512-ewMwGcumrilnF87H4jjrnvGZEaPFCAC4ebraEK+CurDDmwST/bIicI4hrOAv+0Z0F7DEK4O4H7r8q9vH7IbN4g==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer": { + "version": "0.73.15", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", + "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@react-native/babel-preset": "0.73.21", + "hermes-parser": "0.15.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-plugin-codegen": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", + "license": "MIT", + "dependencies": { + "@react-native/codegen": "0.73.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/babel-preset": { + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.73.4", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/@react-native/codegen": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.15.0.tgz", + "integrity": "sha512-lLYvAd+6BnOqWdnNbP/Q8xfl8LOGw4wVjfrNd9Gt8eoFzhNBRVD95n4l2ksfMVOoxuVyegs85g83KS9QOsxbVQ==", + "license": "MIT" + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.15.0.tgz", + "integrity": "sha512-Q1uks5rjZlE9RjMMjSUCkGrEIPI5pKJILeCtK1VmTj7U4pf3wVPoo+cxfu+s4cBAPy2JzikIIdCZgBoR6x7U1Q==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.15.0" + } + }, + "node_modules/@react-native/metro-babel-transformer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/@react-native/normalize-color": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@react-native/normalize-color/-/normalize-color-2.1.0.tgz", + "integrity": "sha512-Z1jQI2NpdFJCVgpY+8Dq/Bt3d+YUi1928Q+/CZm/oh66fzM0RUl54vvuXlPJKybH4pdCZey1eDTPaLHkMPNgWA==", + "license": "MIT" + }, + "node_modules/@react-native/normalize-colors": { + "version": "0.73.2", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.73.2.tgz", + "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==", + "license": "MIT" + }, + "node_modules/@react-native/virtualized-lists": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.73.4.tgz", + "integrity": "sha512-HpmLg1FrEiDtrtAbXiwCgXFYyloK/dOIPIuWW3fsqukwJEWAiTzm1nXGJ7xPU5XTHiWZ4sKup5Ebaj8z7iyWog==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react-native": "*" + } + }, + "node_modules/@react-navigation/bottom-tabs": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.6.1.tgz", + "integrity": "sha512-9oD4cypEBjPuaMiu9tevWGiQ4w/d6l3HNhcJ1IjXZ24xvYDSs0mqjUcdt8SWUolCvRrYc/DmNBLlT83bk0bHTw==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^1.3.31", + "color": "^4.2.3", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/core": { + "version": "6.4.17", + "resolved": "https://registry.npmjs.org/@react-navigation/core/-/core-6.4.17.tgz", + "integrity": "sha512-Nd76EpomzChWAosGqWOYE3ItayhDzIEzzZsT7PfGcRFDgW5miHV2t4MZcq9YIK4tzxZjVVpYbIynOOQQd1e0Cg==", + "license": "MIT", + "dependencies": { + "@react-navigation/routers": "^6.1.9", + "escape-string-regexp": "^4.0.0", + "nanoid": "^3.1.23", + "query-string": "^7.1.3", + "react-is": "^16.13.0", + "use-latest-callback": "^0.2.1" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@react-navigation/elements": { + "version": "1.3.31", + "resolved": "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.31.tgz", + "integrity": "sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ==", + "license": "MIT", + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/native": { + "version": "6.1.18", + "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.18.tgz", + "integrity": "sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg==", + "license": "MIT", + "dependencies": { + "@react-navigation/core": "^6.4.17", + "escape-string-regexp": "^4.0.0", + "fast-deep-equal": "^3.1.3", + "nanoid": "^3.1.23" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/@react-navigation/native-stack": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@react-navigation/native-stack/-/native-stack-6.11.0.tgz", + "integrity": "sha512-U5EcUB9Q2NQspCFwYGGNJm0h6wBCOv7T30QjndmvlawLkNt7S7KWbpWyxS9XBHSIKF57RgWjfxuJNTgTstpXxw==", + "license": "MIT", + "dependencies": { + "@react-navigation/elements": "^1.3.31", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "@react-navigation/native": "^6.0.0", + "react": "*", + "react-native": "*", + "react-native-safe-area-context": ">= 3.0.0", + "react-native-screens": ">= 3.0.0" + } + }, + "node_modules/@react-navigation/routers": { + "version": "6.1.9", + "resolved": "https://registry.npmjs.org/@react-navigation/routers/-/routers-6.1.9.tgz", + "integrity": "sha512-lTM8gSFHSfkJvQkxacGM6VJtBt61ip2XO54aNfswD+KMw6eeZ4oehl7m0me3CR9hnDE4+60iAZR8sAhvCiI3NA==", + "license": "MIT", + "dependencies": { + "nanoid": "^3.1.23" + } + }, + "node_modules/@segment/loosely-validate-event": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", + "integrity": "sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==", + "dependencies": { + "component-type": "^1.2.1", + "join-component": "^1.1.0" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@types/hammerjs": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.46.tgz", + "integrity": "sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@urql/core": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@urql/core/-/core-2.3.6.tgz", + "integrity": "sha512-PUxhtBh7/8167HJK6WqBv6Z0piuiaZHQGYbhwpNL9aIQmLROPEdaUYkY4wh45wPQXcTpnd11l0q3Pw+TI11pdw==", + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.0", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/@urql/exchange-retry": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-0.3.0.tgz", + "integrity": "sha512-hHqer2mcdVC0eYnVNbWyi28AlGOPb2vjH3lP3/Bc8Lc8BjhMsDwFMm7WhoP5C1+cfbr/QJ6Er3H/L08wznXxfg==", + "license": "MIT", + "dependencies": { + "@urql/core": ">=2.3.1", + "wonka": "^4.0.14" + }, + "peerDependencies": { + "graphql": "^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", + "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", + "deprecated": "this version is no longer supported, please update to at least 0.8.*", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "license": "MIT", + "dependencies": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "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==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/appdirsjs": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz", + "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==", + "license": "MIT" + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/argsarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz", + "integrity": "sha512-u96dg2GcAKtpTrBdDoFIM7PjcBA+6rSP0OR94MOReNRyUECL6MtQt5XXmRr4qrftYaef9+l5hcpO5te7sML1Cg==", + "license": "WTFPL" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", + "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/babel-core": { + "version": "7.0.0-bridge.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", + "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-react-native-web": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/babel-plugin-react-native-web/-/babel-plugin-react-native-web-0.18.12.tgz", + "integrity": "sha512-4djr9G6fMdwQoD6LQ7hOKAm39+y12flWgovAqS1k5O8f42YQ3A1FFMyV5kKfetZuGhZO5BmNmOdRRZQ1TixtDw==", + "license": "MIT" + }, + "node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", + "peer": true, + "dependencies": { + "hermes-parser": "0.32.0" + } + }, + "node_modules/babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "license": "MIT" + }, + "node_modules/babel-plugin-transform-flow-enums": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", + "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-flow": "^7.12.1" + } + }, + "node_modules/babel-preset-expo": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-10.0.2.tgz", + "integrity": "sha512-hg06qdSTK7MjKmFXSiq6cFoIbI3n3uT8a3NI2EZoISWhu+tedCj4DQduwi+3adFuRuYvAwECI0IYn/5iGh5zWQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/preset-env": "^7.20.0", + "@babel/preset-react": "^7.22.15", + "@react-native/babel-preset": "^0.73.18", + "babel-plugin-react-native-web": "~0.18.10", + "react-refresh": "0.14.0" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/babel-plugin-codegen": { + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", + "license": "MIT", + "dependencies": { + "@react-native/codegen": "0.73.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/babel-preset": { + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/plugin-proposal-async-generator-functions": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.18.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0", + "@babel/plugin-proposal-numeric-separator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.20.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.20.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.18.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.20.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.20.0", + "@babel/plugin-transform-flow-strip-types": "^7.20.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "@react-native/babel-plugin-codegen": "0.73.4", + "babel-plugin-transform-flow-enums": "^0.0.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/core": "*" + } + }, + "node_modules/babel-preset-expo/node_modules/@react-native/codegen": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/babel-preset-expo/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/babel-preset-expo/node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/babel-preset-fbjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", + "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", + "license": "MIT", + "dependencies": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.11", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz", + "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "license": "MIT" + }, + "node_modules/bplist-creator": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.0.tgz", + "integrity": "sha512-sXaHZicyEEmY86WyueLTQesbeoH/mquvarJaQNbjuOQO+7gbFcDEWqKmcWA4cOTLzFlfgvkiVxolk1k5bBIpmg==", + "license": "MIT", + "dependencies": { + "stream-buffers": "2.2.x" + } + }, + "node_modules/bplist-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz", + "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "license": "MIT", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "license": "MIT" + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "license": "MIT" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cacache/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chromium-edge-launcher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-1.0.0.tgz", + "integrity": "sha512-pgtgjNKZ7i5U++1g1PWv75umkHvhVTDOQIZ+sjeUX9483S7Y6MUvO0lrd7ShGlQlFHMN4SwKTCq/X8hWrbv2KA==", + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0", + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/component-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/component-type/-/component-type-1.2.2.tgz", + "integrity": "sha512-99VUHREHiN5cLeHm3YLq312p6v+HUEcwtLCAtelvUDI6+SH5g5Cr85oNR2S1o6ywzL0ykMbuwLzM2ANocjEOIA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.47.0.tgz", + "integrity": "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cross-fetch": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dag-map": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", + "license": "MIT" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/deprecated-react-native-prop-types": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-5.0.0.tgz", + "integrity": "sha512-cIK8KYiiGVOFsKdPMmm1L3tA/Gl+JopXL6F5+C7x39MyPsQYnP57Im/D6bNUzcborD7fcMwiwZqcBdBXXZucYQ==", + "license": "MIT", + "dependencies": { + "@react-native/normalize-colors": "^0.73.0", + "invariant": "^2.2.4", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "license": "ISC" + }, + "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==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-editor": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", + "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/errorhandler": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.2.tgz", + "integrity": "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "escape-html": "~1.0.3" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/exec-async": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/exec-async/-/exec-async-2.2.0.tgz", + "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==", + "license": "MIT" + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expo": { + "version": "50.0.21", + "resolved": "https://registry.npmjs.org/expo/-/expo-50.0.21.tgz", + "integrity": "sha512-lY+HJdQcsTUbEtPhgT3Y2+WwKZdJiYN0Zq5yAOT9293N1TbdLbHCNkOUtFfTmK0JjwgSKbbH4kRlue7a4MJflg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.0", + "@expo/cli": "0.17.13", + "@expo/config": "8.5.6", + "@expo/config-plugins": "7.9.2", + "@expo/metro-config": "0.17.8", + "@expo/vector-icons": "^14.0.0", + "babel-preset-expo": "~10.0.2", + "expo-asset": "~9.0.2", + "expo-file-system": "~16.0.9", + "expo-font": "~11.10.3", + "expo-keep-awake": "~12.8.2", + "expo-modules-autolinking": "1.10.3", + "expo-modules-core": "1.11.14", + "fbemitter": "^3.0.0", + "whatwg-url-without-unicode": "8.0.0-3" + }, + "bin": { + "expo": "bin/cli" + } + }, + "node_modules/expo-asset": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-9.0.2.tgz", + "integrity": "sha512-PzYKME1MgUOoUvwtdzhAyXkjXOXGiSYqGKG/MsXwWr0Ef5wlBaBm2DCO9V6KYbng5tBPFu6hTjoRNil1tBOSow==", + "license": "MIT", + "dependencies": { + "@react-native/assets-registry": "~0.73.1", + "blueimp-md5": "^2.10.0", + "expo-constants": "~15.4.0", + "expo-file-system": "~16.0.0", + "invariant": "^2.2.4", + "md5-file": "^3.2.3" + } + }, + "node_modules/expo-constants": { + "version": "15.4.6", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-15.4.6.tgz", + "integrity": "sha512-vizE69dww2Vl0PTWWvDmK0Jo2/J+WzdcMZlA05YEnEYofQuhKxTVsiuipf79mSOmFavt4UQYC1UnzptzKyfmiQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~8.5.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-file-system": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-16.0.9.tgz", + "integrity": "sha512-3gRPvKVv7/Y7AdD9eHMIdfg5YbUn2zbwKofjsloTI5sEC57SLUFJtbLvUCz9Pk63DaSQ7WIE1JM0EASyvuPbuw==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-font": { + "version": "11.10.3", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-11.10.3.tgz", + "integrity": "sha512-q1Td2zUvmLbCA9GV4OG4nLPw5gJuNY1VrPycsnemN1m8XWTzzs8nyECQQqrcBhgulCgcKZZJJ6U0kC2iuSoQHQ==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-loader": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-4.6.0.tgz", + "integrity": "sha512-RHQTDak7/KyhWUxikn2yNzXL7i2cs16cMp6gEAgkHOjVhoCJQoOJ0Ljrt4cKQ3IowxgCuOrAgSUzGkqs7omj8Q==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-image-picker": { + "version": "14.7.1", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-14.7.1.tgz", + "integrity": "sha512-ILQVOJgI3aEzrDmCFGDPtpAepYkn8mot8G7vfQ51BfFdQbzL6N3Wm1fS/ofdWlAZJl/qT2DwaIh5xYmf3SyGZA==", + "license": "MIT", + "dependencies": { + "expo-image-loader": "~4.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-keep-awake": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-12.8.2.tgz", + "integrity": "sha512-uiQdGbSX24Pt8nGbnmBtrKq6xL/Tm3+DuDRGBk/3ZE/HlizzNosGRIufIMJ/4B4FRw4dw8KU81h2RLuTjbay6g==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-linear-gradient": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-12.7.2.tgz", + "integrity": "sha512-Wwb2EF18ywgrlTodcXJ6Yt/UEcKitRMdXPNyP/IokmeKh4emoq9DxZJpZdkXm3HUTLlbRpi6/t32jrFVqXB9AQ==", + "license": "MIT", + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/expo-modules-autolinking": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-1.10.3.tgz", + "integrity": "sha512-pn4n2Dl4iRh/zUeiChjRIe1C7EqOw1qhccr85viQV7W6l5vgRpY0osE51ij5LKg/kJmGRcJfs12+PwbdTplbKw==", + "license": "MIT", + "dependencies": { + "@expo/config": "~8.5.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "fast-glob": "^3.2.5", + "find-up": "^5.0.0", + "fs-extra": "^9.1.0" + }, + "bin": { + "expo-modules-autolinking": "bin/expo-modules-autolinking.js" + } + }, + "node_modules/expo-modules-autolinking/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo-modules-autolinking/node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/expo-modules-autolinking/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/expo-modules-core": { + "version": "1.11.14", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-1.11.14.tgz", + "integrity": "sha512-+W+A/jYJdWzA43KEAixhoArEb0EzTsS6T3tObYkZ1EHk8LaBT3hnFant52CnFTeVY4pqv4mgutBua2UQQMAWFA==", + "license": "MIT", + "dependencies": { + "invariant": "^2.2.4" + } + }, + "node_modules/expo-sqlite": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/expo-sqlite/-/expo-sqlite-13.4.0.tgz", + "integrity": "sha512-5f7d2EDM+pgerM33KndtX4gWw2nuVaXY68nnqx7PhkiYeyEmeNfZ29bIFtpBzNb/L5l0/DTtRxuSqftxbknFtw==", + "license": "MIT", + "dependencies": { + "@expo/websql": "^1.0.1" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "license": "Apache-2.0" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "license": "BSD-3-Clause", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz", + "integrity": "sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "license": "MIT" + }, + "node_modules/fetch-retry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", + "integrity": "sha512-e6eB7zN6UBSwGVwrbWVH+gdLnkW9WwHhmq2YDK1Sh30pzx1onRVGBvogTlUeWxwTa+L86NYdo4hFkh7O8ZjSnA==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flow-enums-runtime": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", + "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", + "license": "MIT" + }, + "node_modules/flow-parser": { + "version": "0.206.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz", + "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fontfaceobserver": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/fontfaceobserver/-/fontfaceobserver-2.3.0.tgz", + "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", + "license": "BSD-2-Clause" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/freeport-async": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", + "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getenv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/getenv/-/getenv-1.0.0.tgz", + "integrity": "sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "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/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphql": { + "version": "15.8.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", + "integrity": "sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw==", + "license": "MIT", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/graphql-tag": { + "version": "2.12.6", + "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.6.tgz", + "integrity": "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT", + "peer": true + }, + "node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "peer": true, + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/hermes-profile-transformer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz", + "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==", + "license": "MIT", + "dependencies": { + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hosted-git-info": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", + "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "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.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-invalid-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", + "license": "MIT", + "dependencies": { + "is-glob": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-invalid-path/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-path": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", + "license": "MIT", + "dependencies": { + "is-invalid-path": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jimp-compact": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/jimp-compact/-/jimp-compact-0.16.1.tgz", + "integrity": "sha512-dZ6Ra7u1G8c4Letq/B5EzAxj4tLFHL+cGtdpR+PVm4yzPDj+lCk+AbivWt1eOM+ikzkowtyV7qSqX6qr3t71Ww==", + "license": "MIT" + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/join-component": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/join-component/-/join-component-1.1.0.tgz", + "integrity": "sha512-bF7vcQxbODoGK1imE2P9GS9aw4zD0Sd+Hni68IMZLj7zRnquH7dXUmMw9hDI5S/Jzt7q+IyTXN0rSg2GI0IKhQ==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsc-android": { + "version": "250231.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", + "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", + "license": "BSD-2-Clause" + }, + "node_modules/jsc-safe-url": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", + "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", + "license": "0BSD" + }, + "node_modules/jscodeshift": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", + "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.13.16", + "@babel/parser": "^7.13.16", + "@babel/plugin-proposal-class-properties": "^7.13.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", + "@babel/plugin-proposal-optional-chaining": "^7.13.12", + "@babel/plugin-transform-modules-commonjs": "^7.13.8", + "@babel/preset-flow": "^7.13.13", + "@babel/preset-typescript": "^7.13.0", + "@babel/register": "^7.13.16", + "babel-core": "^7.0.0-bridge.0", + "chalk": "^4.1.2", + "flow-parser": "0.*", + "graceful-fs": "^4.2.4", + "micromatch": "^4.0.4", + "neo-async": "^2.5.0", + "node-dir": "^0.1.17", + "recast": "^0.21.0", + "temp": "^0.8.4", + "write-file-atomic": "^2.3.0" + }, + "bin": { + "jscodeshift": "bin/jscodeshift.js" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "license": "MIT" + }, + "node_modules/json-schema-deref-sync": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.13.0.tgz", + "integrity": "sha512-YBOEogm5w9Op337yb6pAT6ZXDqlxAsQCanM3grid8lMWNxRJO/zWEJi3ZzqDL8boWfwhTFym5EFrNgWwpqcBRg==", + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "dag-map": "~1.0.0", + "is-valid-path": "^0.1.1", + "lodash": "^4.17.13", + "md5": "~2.2.0", + "memory-cache": "~0.2.0", + "traverse": "~0.6.6", + "valid-url": "~1.0.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/json-schema-deref-sync/node_modules/md5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "~0.0.1", + "crypt": "~0.0.1", + "is-buffer": "~1.1.1" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.19.0.tgz", + "integrity": "sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.19.0", + "lightningcss-darwin-x64": "1.19.0", + "lightningcss-linux-arm-gnueabihf": "1.19.0", + "lightningcss-linux-arm64-gnu": "1.19.0", + "lightningcss-linux-arm64-musl": "1.19.0", + "lightningcss-linux-x64-gnu": "1.19.0", + "lightningcss-linux-x64-musl": "1.19.0", + "lightningcss-win32-x64-msvc": "1.19.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.19.0.tgz", + "integrity": "sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.19.0.tgz", + "integrity": "sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.19.0.tgz", + "integrity": "sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.19.0.tgz", + "integrity": "sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.19.0.tgz", + "integrity": "sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.19.0.tgz", + "integrity": "sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.19.0.tgz", + "integrity": "sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.19.0.tgz", + "integrity": "sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT" + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "license": "MIT", + "dependencies": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "bin": { + "logkitty": "bin/logkitty.js" + } + }, + "node_modules/logkitty/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/logkitty/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/logkitty/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==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/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==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logkitty/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==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/logkitty/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/marky": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz", + "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==", + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5-file": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz", + "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==", + "license": "MIT", + "dependencies": { + "buffer-alloc": "^1.1.0" + }, + "bin": { + "md5-file": "cli.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/md5hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/md5hex/-/md5hex-1.0.0.tgz", + "integrity": "sha512-c2YOUbp33+6thdCUi34xIyOU/a7bvGKj/3DB1iaPMTuPHf/Q2d5s4sn1FaCOO43XkXggnb08y5W2PU8UNYNLKQ==", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" + }, + "node_modules/memory-cache": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", + "license": "BSD-2-Clause" + }, + "node_modules/merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "license": "MIT", + "dependencies": { + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metro": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.12.tgz", + "integrity": "sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "accepts": "^1.3.7", + "chalk": "^4.0.0", + "ci-info": "^2.0.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "error-stack-parser": "^2.0.6", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "hermes-parser": "0.23.1", + "image-size": "^1.0.2", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "jsc-safe-url": "^0.2.2", + "lodash.throttle": "^4.1.1", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-config": "0.80.12", + "metro-core": "0.80.12", + "metro-file-map": "0.80.12", + "metro-resolver": "0.80.12", + "metro-runtime": "0.80.12", + "metro-source-map": "0.80.12", + "metro-symbolicate": "0.80.12", + "metro-transform-plugins": "0.80.12", + "metro-transform-worker": "0.80.12", + "mime-types": "^2.1.27", + "nullthrows": "^1.1.1", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^6.0.0", + "throat": "^5.0.0", + "ws": "^7.5.10", + "yargs": "^17.6.2" + }, + "bin": { + "metro": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz", + "integrity": "sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "hermes-parser": "0.23.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "license": "MIT" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.23.1" + } + }, + "node_modules/metro-cache": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.12.tgz", + "integrity": "sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==", + "license": "MIT", + "dependencies": { + "exponential-backoff": "^3.1.1", + "flow-enums-runtime": "^0.0.6", + "metro-core": "0.80.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-cache-key": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.12.tgz", + "integrity": "sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-config": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.12.tgz", + "integrity": "sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==", + "license": "MIT", + "dependencies": { + "connect": "^3.6.5", + "cosmiconfig": "^5.0.5", + "flow-enums-runtime": "^0.0.6", + "jest-validate": "^29.6.3", + "metro": "0.80.12", + "metro-cache": "0.80.12", + "metro-core": "0.80.12", + "metro-runtime": "0.80.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-core": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.12.tgz", + "integrity": "sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.80.12" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-file-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.12.tgz", + "integrity": "sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.0.3", + "debug": "^2.2.0", + "fb-watchman": "^2.0.0", + "flow-enums-runtime": "^0.0.6", + "graceful-fs": "^4.2.4", + "invariant": "^2.2.4", + "jest-worker": "^29.6.3", + "micromatch": "^4.0.4", + "node-abort-controller": "^3.1.1", + "nullthrows": "^1.1.1", + "walker": "^1.0.7" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/metro-file-map/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro-file-map/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/metro-minify-terser": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz", + "integrity": "sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "terser": "^5.15.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-resolver": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.12.tgz", + "integrity": "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-runtime": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.12.tgz", + "integrity": "sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-source-map": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.12.tgz", + "integrity": "sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-symbolicate": "0.80.12", + "nullthrows": "^1.1.1", + "ob1": "0.80.12", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-source-map/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-symbolicate": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz", + "integrity": "sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "metro-source-map": "0.80.12", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "bin": { + "metro-symbolicate": "src/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-symbolicate/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro-transform-plugins": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz", + "integrity": "sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro-transform-worker": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz", + "integrity": "sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.0", + "@babel/parser": "^7.20.0", + "@babel/types": "^7.20.0", + "flow-enums-runtime": "^0.0.6", + "metro": "0.80.12", + "metro-babel-transformer": "0.80.12", + "metro-cache": "0.80.12", + "metro-cache-key": "0.80.12", + "metro-minify-terser": "0.80.12", + "metro-source-map": "0.80.12", + "metro-transform-plugins": "0.80.12", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/metro/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", + "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", + "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.23.1" + } + }, + "node_modules/metro/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/metro/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/metro/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/nested-error-stacks": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "license": "MIT" + }, + "node_modules/nocache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz", + "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/node-abort-controller": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", + "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", + "license": "MIT" + }, + "node_modules/node-dir": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.10.5" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "license": "MIT" + }, + "node_modules/node-stream-zip": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/antelle" + } + }, + "node_modules/noop-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/noop-fn/-/noop-fn-1.0.0.tgz", + "integrity": "sha512-pQ8vODlgXt2e7A3mIbFDlizkr46r75V+BJxVAyat8Jl7YmI513gG5cfyRL0FedKraoZ+VAouI1h4/IWpus5pcQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-package-arg": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-7.0.0.tgz", + "integrity": "sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==", + "license": "ISC", + "dependencies": { + "hosted-git-info": "^3.0.2", + "osenv": "^0.1.5", + "semver": "^5.6.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "license": "MIT" + }, + "node_modules/ob1": { + "version": "0.80.12", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.12.tgz", + "integrity": "sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==", + "license": "MIT", + "dependencies": { + "flow-enums-runtime": "^0.0.6" + }, + "engines": { + "node": ">=18" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ora/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==", + "license": "MIT" + }, + "node_modules/ora/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==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ora/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==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-png": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz", + "integrity": "sha512-Nt/a5SfCLiTnQAjx3fHlqp8hRgTL3z7kTQZzvIMS9uCAepnCyjpdEc6M/sz69WqMBdaDBw9sF1F1UaHROYzGkQ==", + "license": "MIT", + "dependencies": { + "pngjs": "^3.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz", + "integrity": "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/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==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/plist": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "license": "MIT", + "dependencies": { + "@xmldom/xmldom": "^0.8.8", + "base64-js": "^1.5.1", + "xmlbuilder": "^15.1.1" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/plist/node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.11.tgz", + "integrity": "sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/plist/node_modules/xmlbuilder": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", + "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pouchdb-collections": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pouchdb-collections/-/pouchdb-collections-1.0.1.tgz", + "integrity": "sha512-31db6JRg4+4D5Yzc2nqsRqsA2oOkZS8DpFav3jf/qVNBxusKa2ClkEIZ2bJNpaDbMfWtnuSq59p6Bn+CipPMdg==", + "license": "Apache 2" + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-format": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", + "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^26.6.2", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/pretty-format/node_modules/@jest/types": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", + "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^15.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": ">= 10.14.2" + } + }, + "node_modules/pretty-format/node_modules/@types/yargs": { + "version": "15.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.20.tgz", + "integrity": "sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "license": "ISC" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode-terminal": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", + "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", + "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", + "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/react-freeze": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz", + "integrity": "sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": ">=17.0.0" + } + }, + "node_modules/react-i18next": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.3.tgz", + "integrity": "sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-native": { + "version": "0.73.6", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.6.tgz", + "integrity": "sha512-oqmZe8D2/VolIzSPZw+oUd6j/bEmeRHwsLn1xLA5wllEYsZ5zNuMsDus235ONOnCRwexqof/J3aztyQswSmiaA==", + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^29.6.3", + "@react-native-community/cli": "12.3.6", + "@react-native-community/cli-platform-android": "12.3.6", + "@react-native-community/cli-platform-ios": "12.3.6", + "@react-native/assets-registry": "0.73.1", + "@react-native/codegen": "0.73.3", + "@react-native/community-cli-plugin": "0.73.17", + "@react-native/gradle-plugin": "0.73.4", + "@react-native/js-polyfills": "0.73.1", + "@react-native/normalize-colors": "0.73.2", + "@react-native/virtualized-lists": "0.73.4", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "ansi-regex": "^5.0.0", + "base64-js": "^1.5.1", + "chalk": "^4.0.0", + "deprecated-react-native-prop-types": "^5.0.0", + "event-target-shim": "^5.0.1", + "flow-enums-runtime": "^0.0.6", + "invariant": "^2.2.4", + "jest-environment-node": "^29.6.3", + "jsc-android": "^250231.0.0", + "memoize-one": "^5.0.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1", + "pretty-format": "^26.5.2", + "promise": "^8.3.0", + "react-devtools-core": "^4.27.7", + "react-refresh": "^0.14.0", + "react-shallow-renderer": "^16.15.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.24.0-canary-efb381bbf-20230505", + "stacktrace-parser": "^0.1.10", + "whatwg-fetch": "^3.0.0", + "ws": "^6.2.2", + "yargs": "^17.6.2" + }, + "bin": { + "react-native": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "18.2.0" + } + }, + "node_modules/react-native-gesture-handler": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.14.1.tgz", + "integrity": "sha512-YiM1BApV4aKeuwsM6O4C2ufwewYEKk6VMXOt0YqEZFMwABBFWhXLySFZYjBSNRU2USGppJbfHP1q1DfFQpKhdA==", + "license": "MIT", + "dependencies": { + "@egjs/hammerjs": "^2.0.17", + "hoist-non-react-statics": "^3.3.0", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-safe-area-context": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-4.8.2.tgz", + "integrity": "sha512-ffUOv8BJQ6RqO3nLml5gxJ6ab3EestPiyWekxdzO/1MQ7NF8fW1Mzh1C5QE9yq573Xefnc7FuzGXjtesZGv7cQ==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native-screens": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-3.29.0.tgz", + "integrity": "sha512-yB1GoAMamFAcYf4ku94uBPn0/ani9QG7NdI98beJ5cet2YFESYYzuEIuU+kt+CNRcO8qqKeugxlfgAa3HyTqlg==", + "license": "MIT", + "dependencies": { + "react-freeze": "^1.0.0", + "warn-once": "^0.1.0" + }, + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, + "node_modules/react-native/node_modules/@react-native/codegen": { + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.0", + "flow-parser": "^0.206.0", + "glob": "^7.1.1", + "invariant": "^2.2.4", + "jscodeshift": "^0.14.0", + "mkdirp": "^0.5.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@babel/preset-env": "^7.1.6" + } + }, + "node_modules/react-native/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/react-native/node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-shallow-renderer": { + "version": "16.15.0", + "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz", + "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1", + "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/readline": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", + "license": "BSD" + }, + "node_modules/recast": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", + "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", + "license": "MIT", + "dependencies": { + "ast-types": "0.15.2", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/remove-trailing-slash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/remove-trailing-slash/-/remove-trailing-slash-0.1.1.tgz", + "integrity": "sha512-o4S4Qh6L2jpnCy83ysZDau+VORNvnFw07CKSAymkd6ICNVEPisMyzlc00KlvvicsxKck94SEwhDnMNdICzO+tA==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dependencies": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/requireg/node_modules/resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.5" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-workspace-root/-/resolve-workspace-root-2.0.0.tgz", + "integrity": "sha512-IsaBUZETJD5WsI11Wt8PKHwaIe45or6pwNc8yflvLJ4DWtImK9kuLoH5kUva/2Mmx/RdIyr4aONNSa2v9LTJsw==", + "license": "MIT" + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", + "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" + }, + "node_modules/scheduler": { + "version": "0.24.0-canary-efb381bbf-20230505", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", + "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-static/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/serve-static/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/simple-plist": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.3.1.tgz", + "integrity": "sha512-iMSw5i0XseMnrhtIzRb7XpQEXepa9xhWxGUojHBL43SIpQuDQkh3Wpy67ZbDzZVr6EKxvwVChnVpdl8hEVLDiw==", + "license": "MIT", + "dependencies": { + "bplist-creator": "0.1.0", + "bplist-parser": "0.3.1", + "plist": "^3.0.5" + } + }, + "node_modules/simple-plist/node_modules/bplist-parser": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.1.tgz", + "integrity": "sha512-PyJxiNtA5T2PlLIeBot4lbp7rj4OadzjnMZD/G5zuBNt8ei/yCU7+wW0h2bag9vr8c+/WuRWmSxbqAl9hL1rBA==", + "license": "MIT", + "dependencies": { + "big-integer": "1.6.x" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/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==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/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==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/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==", + "license": "MIT" + }, + "node_modules/slugify": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", + "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "license": "ISC", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==", + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "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/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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/structured-headers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", + "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "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": ">=8" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/temp": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", + "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", + "license": "MIT", + "dependencies": { + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/tempy": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.7.1.tgz", + "integrity": "sha512-vXPxwOyaNVi9nyczO16mxmHGpl6ASC5/TVhRRHpqeYHvKQm58EaWNvZXxAhR0lYYnBOQFjXjhzeLsaXdjxLjRg==", + "license": "MIT", + "dependencies": { + "del": "^6.0.0", + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.44.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.1.tgz", + "integrity": "sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", + "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/tiny-queue": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-queue/-/tiny-queue-0.2.1.tgz", + "integrity": "sha512-EijGsv7kzd9I9g0ByCl6h42BWNGUZrlCSejfrb3AKeHC33SGbASu1VDf5O3rRiiUOhAC9CHdZxFPbZu0HmR70A==", + "license": "Apache 2" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", + "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", + "license": "MIT", + "dependencies": { + "gopd": "^1.2.0", + "typedarray.prototype.slice": "^1.0.5", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray.prototype.slice": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", + "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "math-intrinsics": "^1.1.0", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-offset": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha512-EGXjXJZhIHiQMK2pQukuFcL303nskqIRzWvPvV5O8miOfwoUb9G+a/Cld60kUyeaybEI94wvVClT10DtfeAExA==", + "license": "MIT" + }, + "node_modules/use-latest-callback": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/use-latest-callback/-/use-latest-callback-0.2.6.tgz", + "integrity": "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/valid-url": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", + "license": "ISC", + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "license": "MIT" + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/warn-once": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/warn-once/-/warn-once-0.1.1.tgz", + "integrity": "sha512-VkQZJbO8zVImzYFteBXvBOZEl1qL175WH8VmZcxF2fZAoudNhNDvHi+doCaAEdU2l2vtcIwa2zn0QK5+I1HQ3Q==", + "license": "MIT" + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url-without-unicode": { + "version": "8.0.0-3", + "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", + "integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==", + "license": "MIT", + "dependencies": { + "buffer": "^5.4.3", + "punycode": "^2.1.1", + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/whatwg-url-without-unicode/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wonka": { + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/wonka/-/wonka-4.0.15.tgz", + "integrity": "sha512-U0IUQHKXXn6PFo9nqsHphVCE5m3IntqZNB9Jjn7EB1lrR7YTDY3YWgFvEvwniTzXSvOH/XMzAZaIfJF/LvHYXg==", + "license": "MIT" + }, + "node_modules/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==", + "license": "MIT", + "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/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==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xcode": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-3.0.1.tgz", + "integrity": "sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==", + "license": "Apache-2.0", + "dependencies": { + "simple-plist": "^1.1.0", + "uuid": "^7.0.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/xcode/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/xml2js": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz", + "integrity": "sha512-eLTh0kA8uHceqesPqSE+VvO1CDDJWMwlQfB6LuN6T8w6MaDJ8Txm8P7s5cHD0miF0V+GGTZrDQfxPZQVsur33w==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml2js/node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlbuilder": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-14.0.0.tgz", + "integrity": "sha512-ts+B2rSe4fIckR6iquDjsKbQFK2NlUk6iG5nf14mDEyldgoc2nEKZ3jZWMPTxGQwVgToSjt6VGIho1H8/fNFTg==", + "license": "MIT", + "engines": { + "node": ">=8.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src-ios/package.json b/src-ios/package.json new file mode 100644 index 0000000..85ad4dd --- /dev/null +++ b/src-ios/package.json @@ -0,0 +1,30 @@ +{ + "name": "opencontext-ios", + "version": "0.1.0", + "private": true, + "main": "node_modules/expo/AppEntry.js", + "scripts": { + "start": "npx expo start", + "ios": "expo run:ios", + "android": "expo run:android", + "web": "npx expo start --web" + }, + "dependencies": { + "@react-native-async-storage/async-storage": "^1.23.1", + "@react-navigation/bottom-tabs": "^6.6.1", + "@react-navigation/native": "^6.1.17", + "@react-navigation/native-stack": "^6.10.0", + "expo": "~50.0.0", + "expo-file-system": "~16.0.5", + "expo-image-picker": "~14.7.1", + "expo-linear-gradient": "~12.7.1", + "expo-sqlite": "~13.4.0", + "i18next": "^23.11.5", + "react": "18.2.0", + "react-i18next": "^14.1.2", + "react-native": "0.73.6", + "react-native-gesture-handler": "~2.14.0", + "react-native-safe-area-context": "4.8.2", + "react-native-screens": "~3.29.0" + } +} diff --git a/src-ios/screens/DocEditorScreen.js b/src-ios/screens/DocEditorScreen.js new file mode 100644 index 0000000..2551b83 --- /dev/null +++ b/src-ios/screens/DocEditorScreen.js @@ -0,0 +1,123 @@ +const React = require('react'); +const { View, Text, TextInput, StyleSheet, Pressable, Alert } = require('react-native'); +const { useTranslation } = require('react-i18next'); +const Screen = require('../components/Screen'); +const EditorWebView = require('../components/EditorWebView'); +const { createDoc, updateDoc, deleteDoc, loadDocContent } = require('../db/docs'); +const { typography, spacing, colors } = require('../theme'); + +function DocEditorScreen({ navigation, route }) { + const { t } = useTranslation(); + const { mode, doc } = route.params || { mode: 'create' }; + const [title, setTitle] = React.useState(doc?.name || ''); + const [content, setContent] = React.useState(''); + + React.useEffect(() => { + let mounted = true; + if (doc) { + loadDocContent(doc).then((text) => { + if (mounted) { + setContent(text || ''); + } + }); + } + return () => { + mounted = false; + }; + }, [doc]); + + const handleSave = async () => { + if (mode === 'create') { + await createDoc({ title, content }); + } else { + await updateDoc({ id: doc.id, title, content }); + } + navigation.goBack(); + }; + + const handleDelete = async () => { + if (mode !== 'edit') return; + Alert.alert(t('common.delete'), t('common.delete'), [ + { text: t('common.cancel'), style: 'cancel' }, + { + text: t('common.delete'), + style: 'destructive', + onPress: async () => { + await deleteDoc(doc.id); + navigation.goBack(); + }, + }, + ]); + }; + + return ( + <Screen> + <View style={styles.header}> + <Text style={styles.heading}>{t('docs.title')}</Text> + <View style={styles.actions}> + {mode === 'edit' ? ( + <Pressable onPress={handleDelete}> + <Text style={styles.delete}>{t('common.delete')}</Text> + </Pressable> + ) : null} + <Pressable onPress={handleSave}> + <Text style={styles.save}>{t('common.save')}</Text> + </Pressable> + </View> + </View> + <View style={styles.editorCard}> + <TextInput + value={title} + onChangeText={setTitle} + placeholder={t('common.title')} + style={styles.titleInput} + placeholderTextColor={colors.mutedInk} + /> + <EditorWebView docId={doc?.id || 'new-doc'} markdown={content} onChange={setContent} /> + </View> + </Screen> + ); +} + +const styles = StyleSheet.create({ + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: spacing.lg, + }, + heading: { + ...typography.title, + }, + actions: { + flexDirection: 'row', + gap: spacing.md, + }, + save: { + ...typography.body, + color: colors.accent, + fontWeight: '600', + }, + delete: { + ...typography.body, + color: '#b42318', + }, + editorCard: { + flex: 1, + }, + titleInput: { + ...typography.body, + fontSize: 18, + marginBottom: spacing.sm, + borderBottomWidth: 1, + borderBottomColor: colors.border, + paddingBottom: spacing.sm, + }, + contentInput: { + ...typography.body, + flex: 1, + marginTop: spacing.sm, + }, +}); + +module.exports = DocEditorScreen; diff --git a/src-ios/screens/DocsScreen.js b/src-ios/screens/DocsScreen.js new file mode 100644 index 0000000..6e16dd5 --- /dev/null +++ b/src-ios/screens/DocsScreen.js @@ -0,0 +1,96 @@ +const React = require('react'); +const { View, Text, StyleSheet, FlatList } = require('react-native'); +const { useTranslation } = require('react-i18next'); +const Screen = require('../components/Screen'); +const Card = require('../components/Card'); +const EmptyState = require('../components/EmptyState'); +const FadeInView = require('../components/FadeInView'); +const { listDocs } = require('../db/docs'); +const { typography, spacing, colors } = require('../theme'); +const { formatDate } = require('../utils/date'); + +function DocsScreen({ navigation }) { + const { t, i18n } = useTranslation(); + const [docs, setDocs] = React.useState([]); + + const loadDocs = React.useCallback(async () => { + const data = await listDocs(); + setDocs(data); + }, []); + + React.useEffect(() => { + const unsubscribe = navigation.addListener('focus', loadDocs); + return unsubscribe; + }, [navigation, loadDocs]); + + const renderItem = ({ item }) => ( + <Card style={styles.card}> + <Text style={styles.title}>{item.name}</Text> + <Text style={styles.preview} numberOfLines={2}> + {item.description || t('docs.emptyBody')} + </Text> + <Text style={styles.meta}>{formatDate(item.updated_at, i18n.language)}</Text> + </Card> + ); + + return ( + <Screen> + <FadeInView style={styles.header}> + <Text style={styles.heading}>{t('docs.title')}</Text> + {docs.length > 0 ? <Text style={styles.subhead}>{t('docs.emptyBody')}</Text> : null} + </FadeInView> + <View style={styles.listWrapper}> + {docs.length === 0 ? ( + <EmptyState title={t('docs.emptyTitle')} body={t('docs.comingSoon')} /> + ) : ( + <FlatList + data={docs} + keyExtractor={(item) => String(item.id)} + renderItem={renderItem} + contentContainerStyle={styles.list} + /> + )} + </View> + </Screen> + ); +} + +const styles = StyleSheet.create({ + header: { + marginBottom: spacing.md, + }, + heading: { + ...typography.title, + fontSize: 28, + fontWeight: '700', + }, + subhead: { + ...typography.subtitle, + marginTop: spacing.xs, + }, + listWrapper: { + flex: 1, + }, + list: { + gap: spacing.md, + paddingBottom: spacing.xl, + }, + card: { + marginBottom: spacing.md, + }, + title: { + ...typography.body, + fontWeight: '600', + marginBottom: spacing.xs, + }, + preview: { + ...typography.subtitle, + color: colors.mutedInk, + }, + meta: { + ...typography.label, + marginTop: spacing.sm, + }, +}); + +module.exports = DocsScreen; diff --git a/src-ios/screens/IdeasScreen.js b/src-ios/screens/IdeasScreen.js new file mode 100644 index 0000000..fbef2d9 --- /dev/null +++ b/src-ios/screens/IdeasScreen.js @@ -0,0 +1,1993 @@ +const React = require('react'); +const { + View, + Text, + StyleSheet, + SectionList, + Modal, + ScrollView, + TextInput, + InputAccessoryView, + Image, + Pressable, + Alert, + ActionSheetIOS, + Animated, + Easing, + ActivityIndicator, + KeyboardAvoidingView, + Keyboard, + Platform, +} = require('react-native'); +const { Swipeable } = require('react-native-gesture-handler'); +const { useTranslation } = require('react-i18next'); +const ImagePicker = require('expo-image-picker'); +const { Ionicons } = require('@expo/vector-icons'); +const Screen = require('../components/Screen'); +const EmptyState = require('../components/EmptyState'); +const FadeInView = require('../components/FadeInView'); +const { + listThreads, + listBoxes, + createThread, + continueThread, + deleteEntry, + deleteThread, + createBox, + renameBox, + deleteBox, + moveThread, +} = require('../services/ideas'); +const { importImageAsset } = require('../services/images'); +const { loadAIConfig, isAIAvailable, generateReflection } = require('../services/ai'); +const { typography, spacing, colors } = require('../theme'); +const { formatDateDisplay, formatRelativeTime, formatDateKey } = require('../utils/ideaTime'); + +function IdeasScreen({ navigation }) { + const { t, i18n } = useTranslation(); + const DEFAULT_BOX = 'inbox'; + const COMPOSER_MIN_HEIGHT = 40; + const COMPOSER_PADDING = spacing.xs; + const MAX_IMAGES = 6; + const [threads, setThreads] = React.useState([]); + const [boxes, setBoxes] = React.useState([DEFAULT_BOX]); + const [selectedBox, setSelectedBox] = React.useState(DEFAULT_BOX); + const [isMoveModalOpen, setIsMoveModalOpen] = React.useState(false); + const [moveThreadId, setMoveThreadId] = React.useState(null); + const [inputText, setInputText] = React.useState(''); + const [composerHeight, setComposerHeight] = React.useState(COMPOSER_MIN_HEIGHT); + const [inputImages, setInputImages] = React.useState([]); + const [replyingThreadId, setReplyingThreadId] = React.useState(null); + const [replyText, setReplyText] = React.useState(''); + const [replyImages, setReplyImages] = React.useState([]); + const [isReplyModalOpen, setIsReplyModalOpen] = React.useState(false); + const [isKeyboardVisible, setIsKeyboardVisible] = React.useState(false); + const [isReplying, setIsReplying] = React.useState(false); + const [reflectingThreadId, setReflectingThreadId] = React.useState(null); + const [reflectionError, setReflectionError] = React.useState(''); + const [isReflecting, setIsReflecting] = React.useState(false); + const [reflectionText, setReflectionText] = React.useState(''); + const [isSavingReflection, setIsSavingReflection] = React.useState(false); + const [lastAddedEntryId, setLastAddedEntryId] = React.useState(null); + const inputRef = React.useRef(null); + const replyInputRef = React.useRef(null); + const clearAnimRef = React.useRef(null); + const moveAnimRef = React.useRef(new Animated.Value(0)); + const moveAnim = moveAnimRef.current; + + const normalizeBoxes = React.useCallback((items = []) => { + const unique = Array.from(new Set([DEFAULT_BOX, ...items].filter(Boolean))); + const rest = unique.filter((box) => box !== DEFAULT_BOX).sort(); + return [DEFAULT_BOX, ...rest]; + }, [DEFAULT_BOX]); + + const loadIdeas = React.useCallback(async (boxToLoad) => { + const targetBox = boxToLoad || selectedBox || DEFAULT_BOX; + const [threadData, boxData] = await Promise.all([ + listThreads({ box: targetBox }), + listBoxes(), + ]); + const nextBoxes = normalizeBoxes(boxData); + setBoxes(nextBoxes); + if (!nextBoxes.includes(targetBox)) { + const fallback = nextBoxes[0] || DEFAULT_BOX; + setSelectedBox(fallback); + const fallbackThreads = await listThreads({ box: fallback }); + setThreads(fallbackThreads); + return; + } + setThreads(threadData); + }, [DEFAULT_BOX, listThreads, listBoxes, normalizeBoxes, selectedBox]); + + React.useEffect(() => { + loadIdeas(selectedBox); + }, [loadIdeas, selectedBox]); + + React.useEffect(() => { + const unsubscribe = navigation.addListener('focus', () => loadIdeas(selectedBox)); + return unsubscribe; + }, [navigation, loadIdeas, selectedBox]); + + const handleCreate = async () => { + const text = inputText.trim(); + if (!text && inputImages.length === 0) return; + const thread = await createThread({ content: text, images: inputImages, box: selectedBox }); + setInputText(''); + setInputImages([]); + setComposerHeight(COMPOSER_MIN_HEIGHT); + if (inputRef.current) { + inputRef.current.blur(); + } + Keyboard.dismiss(); + const entryId = thread?.entries?.[0]?.id; + if (entryId) { + setLastAddedEntryId(entryId); + if (clearAnimRef.current) { + clearTimeout(clearAnimRef.current); + } + clearAnimRef.current = setTimeout(() => { + setLastAddedEntryId(null); + }, 600); + } + loadIdeas(selectedBox); + }; + + React.useEffect(() => { + if (isReplyModalOpen && replyInputRef.current) { + replyInputRef.current.focus(); + } + }, [isReplyModalOpen]); + + React.useEffect(() => { + const showEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow'; + const hideEvent = Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide'; + const showSub = Keyboard.addListener(showEvent, () => setIsKeyboardVisible(true)); + const hideSub = Keyboard.addListener(hideEvent, () => setIsKeyboardVisible(false)); + return () => { + showSub.remove(); + hideSub.remove(); + }; + }, []); + + const handleStartContinue = (threadId) => { + setReflectingThreadId(null); + setReflectionError(''); + setReflectionText(''); + setReplyingThreadId(threadId); + setReplyText(''); + setReplyImages([]); + setIsReplyModalOpen(true); + }; + + const handleCancelContinue = () => { + setIsReplyModalOpen(false); + setReplyingThreadId(null); + setReplyText(''); + setReplyImages([]); + if (replyInputRef.current) { + replyInputRef.current.blur(); + } + Keyboard.dismiss(); + }; + + const handleSubmitContinue = async () => { + const text = replyText.trim(); + if ((!text && replyImages.length === 0) || !replyingThreadId || isReplying) return; + setIsReplying(true); + try { + const entry = await continueThread({ threadId: replyingThreadId, content: text, images: replyImages }); + let updated = false; + setThreads((prev) => + prev.map((thread) => { + if (thread.id !== replyingThreadId) { + return thread; + } + updated = true; + return { + ...thread, + updatedAt: entry?.createdAt || thread.updatedAt, + entries: [...thread.entries, entry], + }; + }), + ); + setReplyingThreadId(null); + setReplyText(''); + setReplyImages([]); + setIsReplyModalOpen(false); + if (replyInputRef.current) { + replyInputRef.current.blur(); + } + Keyboard.dismiss(); + if (!updated) { + loadIdeas(); + } + } finally { + setIsReplying(false); + } + }; + + const handleStartReflect = async (threadId) => { + if (isReflecting) return; + const config = await loadAIConfig(); + if (!isAIAvailable(config)) { + Alert.alert(t('ideas.aiNotConfigured')); + return; + } + setIsReplyModalOpen(false); + setReplyingThreadId(null); + setReflectionError(''); + setReflectionText(''); + setReflectingThreadId(threadId); + setIsReflecting(true); + try { + const thread = threads.find((t) => t.id === threadId); + const entries = thread?.entries || []; + const text = await generateReflection(entries, { language: i18n.language, config }); + if (!text) { + throw new Error(t('ideas.aiEmpty')); + } + setReflectionText(text); + } catch (err) { + setReflectionError(err?.message || t('ideas.aiError')); + } finally { + setIsReflecting(false); + } + }; + + const handleSaveReflection = async () => { + if (!reflectionText.trim() || !reflectingThreadId || isSavingReflection) return; + setIsSavingReflection(true); + try { + const entry = await continueThread({ + threadId: reflectingThreadId, + content: reflectionText.trim(), + isAI: true, + }); + setThreads((prev) => + prev.map((threadItem) => { + if (threadItem.id !== reflectingThreadId) return threadItem; + return { + ...threadItem, + updatedAt: entry?.createdAt || threadItem.updatedAt, + entries: [...threadItem.entries, entry], + }; + }), + ); + setReflectingThreadId(null); + setReflectionText(''); + setReflectionError(''); + } finally { + setIsSavingReflection(false); + } + }; + + const handleRetryReflect = () => { + if (!reflectingThreadId) return; + handleStartReflect(reflectingThreadId); + }; + + const handleCancelReflect = () => { + setReflectingThreadId(null); + setReflectionError(''); + setIsReflecting(false); + setReflectionText(''); + }; + + const pickImages = React.useCallback(async (target) => { + const currentImages = target === 'main' ? inputImages : replyImages; + const remaining = MAX_IMAGES - currentImages.length; + if (remaining <= 0) { + Alert.alert(t('ideas.imageLimit', { count: MAX_IMAGES })); + return; + } + const permission = await ImagePicker.requestMediaLibraryPermissionsAsync(); + if (!permission.granted) { + Alert.alert(t('ideas.imagePermissionTitle'), t('ideas.imagePermissionBody')); + return; + } + const result = await ImagePicker.launchImageLibraryAsync({ + mediaTypes: ImagePicker.MediaTypeOptions.Images, + allowsMultipleSelection: remaining > 1, + selectionLimit: remaining, + quality: 0.9, + }); + if (result.canceled) return; + const assets = result.assets || []; + try { + const stored = []; + for (const asset of assets) { + const uri = await importImageAsset(asset); + if (uri) stored.push(uri); + } + if (stored.length === 0) return; + if (target === 'main') { + setInputImages((prev) => [...prev, ...stored]); + } else { + setReplyImages((prev) => [...prev, ...stored]); + } + } catch (error) { + Alert.alert(t('ideas.imageImportFailed')); + } + }, [inputImages, replyImages, MAX_IMAGES, t]); + + const removeImage = React.useCallback((target, index) => { + if (target === 'main') { + setInputImages((prev) => prev.filter((_, idx) => idx !== index)); + } else { + setReplyImages((prev) => prev.filter((_, idx) => idx !== index)); + } + }, []); + + const clearThreadState = React.useCallback((threadId) => { + if (replyingThreadId === threadId) { + setIsReplyModalOpen(false); + setReplyingThreadId(null); + setReplyText(''); + setReplyImages([]); + } + if (reflectingThreadId === threadId) { + setReflectingThreadId(null); + setReflectionError(''); + setReflectionText(''); + setIsReflecting(false); + } + }, [reflectingThreadId, replyingThreadId]); + + const confirmDeleteEntry = React.useCallback((entry) => { + Alert.alert( + t('ideas.deleteEntryConfirm'), + t('ideas.deleteEntryHint'), + [ + { text: t('common.cancel'), style: 'cancel' }, + { + text: t('common.delete'), + style: 'destructive', + onPress: async () => { + await deleteEntry({ threadId: entry.threadId, entryId: entry.id }); + loadIdeas(selectedBox); + }, + }, + ], + ); + }, [deleteEntry, loadIdeas, selectedBox, t]); + + const confirmDeleteThread = React.useCallback((threadId) => { + Alert.alert( + t('ideas.deleteThreadConfirm'), + t('ideas.deleteThreadHint'), + [ + { text: t('common.cancel'), style: 'cancel' }, + { + text: t('common.delete'), + style: 'destructive', + onPress: async () => { + await deleteThread(threadId); + clearThreadState(threadId); + loadIdeas(selectedBox); + }, + }, + ], + ); + }, [clearThreadState, deleteThread, loadIdeas, selectedBox, t]); + + const handleEntryActions = React.useCallback((entry) => { + const thread = threads.find((item) => item.id === entry.threadId); + const canDeleteThread = (thread?.entries?.length || 0) > 1; + const options = [ + t('ideas.deleteEntry'), + ...(canDeleteThread ? [t('ideas.deleteThread')] : []), + t('common.cancel'), + ]; + const cancelButtonIndex = options.length - 1; + const destructiveButtonIndex = canDeleteThread ? 1 : 0; + + if (Platform.OS === 'ios') { + ActionSheetIOS.showActionSheetWithOptions( + { + options, + cancelButtonIndex, + destructiveButtonIndex, + title: t('ideas.entryActionsTitle'), + }, + (buttonIndex) => { + if (buttonIndex === 0) { + confirmDeleteEntry(entry); + } else if (canDeleteThread && buttonIndex === 1) { + confirmDeleteThread(entry.threadId); + } + }, + ); + return; + } + + Alert.alert( + t('ideas.entryActionsTitle'), + undefined, + [ + { + text: t('ideas.deleteEntry'), + style: 'destructive', + onPress: () => confirmDeleteEntry(entry), + }, + canDeleteThread + ? { + text: t('ideas.deleteThread'), + style: 'destructive', + onPress: () => confirmDeleteThread(entry.threadId), + } + : null, + { text: t('common.cancel'), style: 'cancel' }, + ].filter(Boolean), + ); + }, [confirmDeleteEntry, confirmDeleteThread, threads, t]); + + const renderSwipeActions = React.useCallback((entry, progress) => { + const opacity = progress.interpolate({ + inputRange: [0, 0.4, 1], + outputRange: [0, 0.7, 1], + extrapolate: 'clamp', + }); + const translateX = progress.interpolate({ + inputRange: [0, 1], + outputRange: [12, 0], + extrapolate: 'clamp', + }); + const scale = progress.interpolate({ + inputRange: [0, 1], + outputRange: [0.96, 1], + extrapolate: 'clamp', + }); + + return ( + <View style={styles.swipeActions}> + <Pressable + style={styles.swipeDeletePressable} + onPress={() => handleEntryActions(entry)} + > + <Animated.View + style={[ + styles.swipeDelete, + { + opacity, + transform: [{ translateX }, { scale }], + }, + ]} + > + <Text style={styles.swipeDeleteText}>{t('common.delete')}</Text> + </Animated.View> + </Pressable> + </View> + ); + }, [handleEntryActions, t]); + + const validateBoxName = React.useCallback((value) => { + const name = String(value || '').trim(); + if (!name) return null; + if (name.includes('/') || name.includes('\\')) { + Alert.alert(t('ideas.boxNameInvalid')); + return null; + } + return name; + }, [t]); + + const promptForBoxName = React.useCallback((title, message, actionLabel, initialValue, onSubmit) => { + if (Platform.OS !== 'ios') { + Alert.alert(title, message || ''); + return; + } + Alert.prompt( + title, + message, + [ + { text: t('common.cancel'), style: 'cancel' }, + { + text: actionLabel, + onPress: (value) => { + const name = validateBoxName(value); + if (!name) return; + onSubmit(name); + }, + }, + ], + 'plain-text', + initialValue, + ); + }, [t, validateBoxName]); + + const handleCreateBox = React.useCallback(() => { + promptForBoxName( + t('ideas.boxCreateTitle'), + t('ideas.boxCreateHint'), + t('common.create'), + '', + async (name) => { + const box = await createBox(name); + setSelectedBox(box); + loadIdeas(box); + }, + ); + }, [createBox, loadIdeas, promptForBoxName, t]); + + const handleRenameBox = React.useCallback((box) => { + if (box === DEFAULT_BOX) return; + promptForBoxName( + t('ideas.boxRenameTitle'), + t('ideas.boxRenameHint'), + t('common.save'), + box, + async (name) => { + const nextBox = await renameBox(box, name); + if (box === selectedBox) { + setSelectedBox(nextBox); + } + loadIdeas(nextBox); + }, + ); + }, [DEFAULT_BOX, loadIdeas, promptForBoxName, renameBox, selectedBox, t]); + + const handleDeleteBox = React.useCallback((box) => { + if (box === DEFAULT_BOX) return; + Alert.alert( + t('ideas.boxDeleteTitle'), + t('ideas.boxDeleteConfirm', { name: box }), + [ + { text: t('common.cancel'), style: 'cancel' }, + { + text: t('common.delete'), + style: 'destructive', + onPress: async () => { + await deleteBox(box); + const nextBox = box === selectedBox ? DEFAULT_BOX : selectedBox; + setSelectedBox(nextBox); + loadIdeas(nextBox); + }, + }, + ], + ); + }, [DEFAULT_BOX, deleteBox, loadIdeas, selectedBox, t]); + + const handleBoxActions = React.useCallback((box) => { + if (box === DEFAULT_BOX) return; + Alert.alert( + t('ideas.boxActionsTitle'), + box, + [ + { text: t('ideas.boxRename'), onPress: () => handleRenameBox(box) }, + { text: t('ideas.boxDelete'), style: 'destructive', onPress: () => handleDeleteBox(box) }, + { text: t('common.cancel'), style: 'cancel' }, + ], + ); + }, [DEFAULT_BOX, handleDeleteBox, handleRenameBox, t]); + + const openMoveModal = React.useCallback((threadId) => { + setMoveThreadId(threadId); + setIsMoveModalOpen(true); + moveAnim.setValue(0); + Animated.timing(moveAnim, { + toValue: 1, + duration: 220, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + }, [moveAnim]); + + const closeMoveModal = React.useCallback(() => { + Animated.timing(moveAnim, { + toValue: 0, + duration: 180, + easing: Easing.in(Easing.cubic), + useNativeDriver: true, + }).start(({ finished }) => { + if (!finished) return; + setIsMoveModalOpen(false); + setMoveThreadId(null); + }); + }, [moveAnim]); + + const handleMoveThread = React.useCallback(async (targetBox) => { + if (!moveThreadId) return; + await moveThread({ threadId: moveThreadId, targetBox }); + closeMoveModal(); + loadIdeas(selectedBox); + }, [closeMoveModal, loadIdeas, moveThread, moveThreadId, selectedBox]); + + const canPublish = inputText.trim().length > 0 || inputImages.length > 0; + const canReplyPublish = replyText.trim().length > 0 || replyImages.length > 0; + const sections = React.useMemo(() => buildSections(threads), [threads]); + const replyThread = React.useMemo( + () => threads.find((thread) => thread.id === replyingThreadId), + [threads, replyingThreadId], + ); + const mainAccessoryId = 'main-accessory'; + const replyAccessoryId = 'reply-accessory'; + const contextEntries = React.useMemo(() => { + const entries = replyThread?.entries || []; + const maxItems = isKeyboardVisible ? 1 : 2; + return entries.slice(-maxItems); + }, [replyThread, isKeyboardVisible]); + + const getEntryPreview = React.useCallback( + (entry) => { + const text = entry?.content?.trim(); + if (text) return text; + if (entry?.images?.length) return t('ideas.addImage'); + return t('common.emptyTitle'); + }, + [t], + ); + + const handleDismissKeyboard = React.useCallback((target) => { + if (target === 'main' && inputRef.current) { + inputRef.current.blur(); + } + if (target === 'reply' && replyInputRef.current) { + replyInputRef.current.blur(); + } + Keyboard.dismiss(); + }, []); + + return ( + <Screen> + <KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'padding' : undefined} style={styles.flex}> + <FadeInView style={styles.header}> + <View style={styles.headerRow}> + <Text style={styles.heading}>{t('ideas.title')}</Text> + <Pressable style={styles.boxAddButton} onPress={handleCreateBox}> + <Text style={styles.boxAddText}>+</Text> + </Pressable> + </View> + <ScrollView + horizontal + showsHorizontalScrollIndicator={false} + contentContainerStyle={styles.boxRowContent} + > + {boxes.map((box) => { + const isActive = box === selectedBox; + const label = box === DEFAULT_BOX ? t('ideas.boxInbox') : box; + return ( + <Pressable + key={box} + onPress={() => setSelectedBox(box)} + onLongPress={() => handleBoxActions(box)} + style={[styles.boxChip, isActive && styles.boxChipActive]} + > + <Text style={[styles.boxChipText, isActive && styles.boxChipTextActive]}> + {label} + </Text> + </Pressable> + ); + })} + <Pressable style={styles.boxAddChip} onPress={handleCreateBox}> + <Text style={styles.boxAddChipText}>{t('ideas.boxAdd')}</Text> + </Pressable> + </ScrollView> + </FadeInView> + <View style={styles.composer}> + <TextInput + ref={inputRef} + value={inputText} + onChangeText={setInputText} + placeholder={t('ideas.editorPlaceholder')} + style={[styles.input, { height: composerHeight }]} + onContentSizeChange={(event) => { + const nextHeight = Math.max( + COMPOSER_MIN_HEIGHT, + event.nativeEvent.contentSize.height + COMPOSER_PADDING * 2, + ); + setComposerHeight((prev) => (prev === nextHeight ? prev : nextHeight)); + }} + multiline + scrollEnabled={false} + textAlignVertical="top" + placeholderTextColor={colors.mutedInk} + inputAccessoryViewID={Platform.OS === 'ios' ? mainAccessoryId : undefined} + /> + {inputImages.length > 0 ? ( + <View style={styles.imageRow}> + {inputImages.map((uri, index) => ( + <View key={`${uri}-${index}`} style={styles.imageItem}> + <Image source={{ uri }} style={styles.imageThumb} /> + <Pressable + style={styles.imageRemove} + onPress={() => removeImage('main', index)} + > + <Text style={styles.imageRemoveText}>×</Text> + </Pressable> + </View> + ))} + </View> + ) : null} + <View style={styles.composerActions}> + <Pressable + style={styles.imageButton} + onPress={() => pickImages('main')} + accessibilityLabel={t('ideas.addImage')} + > + <ImageIcon /> + </Pressable> + <Pressable + style={[styles.publishButton, !canPublish && styles.publishButtonDisabled]} + onPress={handleCreate} + disabled={!canPublish} + > + <Text style={styles.publishText}>{t('ideas.publish')}</Text> + </Pressable> + </View> + </View> + <View style={styles.listWrapper}> + {sections.length === 0 ? ( + <EmptyState title={t('ideas.emptyTitle')} body={t('ideas.emptyBody')} /> + ) : ( + <SectionList + sections={sections} + keyExtractor={(item) => item.id} + keyboardShouldPersistTaps="handled" + showsVerticalScrollIndicator={false} + stickySectionHeadersEnabled={false} + renderSectionHeader={({ section }) => ( + <View style={styles.sectionHeader}> + <Text style={styles.sectionTitle}> + {formatDateDisplay(section.dateKey, t)} + </Text> + <View style={styles.sectionLine} /> + </View> + )} + renderItem={({ item }) => { + const isReflectingEntry = item.isLastInThread && reflectingThreadId === item.threadId; + return ( + <AnimatedEntry isActive={item.id === lastAddedEntryId}> + <Swipeable + renderRightActions={(progress) => renderSwipeActions(item, progress)} + overshootRight={false} + > + <View style={!isReflectingEntry && item.isLastInThread ? styles.entryBlockLast : null}> + <View style={styles.entryRow}> + <View style={styles.leftCol}> + {!item.isFirstInThread && ( + <View style={[styles.lineTop, styles.lineUser]} /> + )} + {!item.isLastInThread + || replyingThreadId === item.threadId + || reflectingThreadId === item.threadId ? ( + <View style={[styles.lineBottom, styles.lineUser]} /> + ) : null} + <View style={[styles.ball, item.isAI ? styles.ballAi : styles.ballUser]}> + {item.isAI ? <AiSparkle /> : null} + </View> + </View> + <View style={styles.entryRight}> + <View style={styles.entryHeader}> + <View style={styles.entryBody}> + <Text style={[styles.entryText, item.isAI ? styles.entryTextAi : null]}> + {item.content} + </Text> + {item.images?.length ? ( + <View style={styles.entryImages}> + {item.images.map((uri, index) => ( + <Image + key={`${item.id}-img-${index}`} + source={{ uri }} + style={styles.entryImage} + /> + ))} + </View> + ) : null} + {item.isLastInThread && replyingThreadId !== item.threadId && reflectingThreadId !== item.threadId ? ( + <View style={styles.actionRow}> + <Pressable + onPress={() => handleStartContinue(item.threadId)} + style={styles.continueButton} + > + <Text style={styles.continueText}>{t('ideas.continue')}</Text> + </Pressable> + <Pressable + onPress={() => handleStartReflect(item.threadId)} + style={styles.aiButton} + > + <Text style={styles.aiText}>{t('ideas.aiReflect')}</Text> + </Pressable> + <Pressable + onPress={() => openMoveModal(item.threadId)} + style={styles.moveButton} + > + <Text style={styles.moveText}>{t('ideas.boxMove')}</Text> + </Pressable> + </View> + ) : null} + </View> + <View style={styles.entryMetaRow}> + <Text style={styles.entryMeta}> + {formatRelativeTime(item.createdAt, t)} + </Text> + </View> + </View> + </View> + </View> + </View> + </Swipeable> + + {isReflectingEntry ? ( + <AnimatedEntry isActive> + <View style={[styles.entryRow, styles.entryBlockLast]}> + <View style={styles.leftCol}> + <View style={[styles.lineTop, styles.lineUser]} /> + <View style={[styles.ball, styles.ballAi]}> + <AiSparkle /> + </View> + </View> + <View style={styles.entryRight}> + <View style={styles.entryHeader}> + <View style={styles.entryBody}> + {isReflecting ? ( + <View style={styles.aiThinkingRow}> + <ActivityIndicator size="small" color={colors.accent} /> + <Text style={styles.aiThinkingText}>{t('ideas.aiThinking')}</Text> + </View> + ) : reflectionError ? ( + <View style={styles.aiErrorBox}> + <Text style={styles.aiErrorText}>{reflectionError}</Text> + <View style={styles.aiErrorActions}> + <Pressable style={styles.replyButtonGhost} onPress={handleCancelReflect}> + <Text style={styles.replyCancel}>{t('common.cancel')}</Text> + </Pressable> + <Pressable style={styles.replyButtonPrimary} onPress={handleRetryReflect}> + <Text style={styles.replySubmit}>{t('ideas.aiRetry')}</Text> + </Pressable> + </View> + </View> + ) : ( + <View> + <TextInput + value={reflectionText} + onChangeText={setReflectionText} + placeholder={t('ideas.aiPlaceholder')} + style={styles.reflectionInput} + multiline + textAlignVertical="top" + placeholderTextColor={colors.mutedInk} + /> + <View style={styles.reflectionFooter}> + <Text style={styles.reflectionHint}>{t('ideas.reflectionEditable')}</Text> + <View style={styles.replyActions}> + <Pressable style={styles.replyButtonGhost} onPress={handleCancelReflect}> + <Text style={styles.replyCancel}>{t('common.cancel')}</Text> + </Pressable> + <Pressable + style={styles.replyButtonPrimary} + onPress={handleSaveReflection} + disabled={!reflectionText.trim() || isSavingReflection} + > + <Text style={styles.replySubmit}>{t('common.save')}</Text> + </Pressable> + </View> + </View> + </View> + )} + </View> + </View> + </View> + </View> + </AnimatedEntry> + ) : null} + </AnimatedEntry> + ); + }} + contentContainerStyle={styles.list} + /> + )} + </View> + </KeyboardAvoidingView> + <Modal + visible={isReplyModalOpen} + animationType="slide" + onRequestClose={handleCancelContinue} + > + <Screen> + <KeyboardAvoidingView + behavior={Platform.OS === 'ios' ? 'padding' : undefined} + style={styles.replyModalRoot} + > + <View style={styles.replyModalHeader}> + <Pressable style={styles.replyModalCancel} onPress={handleCancelContinue}> + <Text style={styles.replyModalCancelText}>{t('common.cancel')}</Text> + </Pressable> + <Text style={styles.replyModalTitle}>{t('ideas.continue')}</Text> + <Pressable + style={[ + styles.replyModalPublish, + (!canReplyPublish || isReplying) && styles.replyModalPublishDisabled, + ]} + onPress={handleSubmitContinue} + disabled={!canReplyPublish || isReplying} + > + <Text style={styles.replyModalPublishText}> + {isReplying ? t('common.save') : t('ideas.publish')} + </Text> + </Pressable> + </View> + <View style={styles.replyModalBody}> + <ScrollView + style={[ + styles.replyModalContext, + isKeyboardVisible && styles.replyModalContextCompact, + ]} + contentContainerStyle={styles.replyModalContextContent} + showsVerticalScrollIndicator={false} + keyboardDismissMode="on-drag" + > + {contextEntries.map((entry, index) => { + const isFirst = index === 0; + const isLast = index === contextEntries.length - 1; + return ( + <View key={entry.id || `${entry.createdAt}-${index}`} style={styles.replyContextItem}> + <View style={styles.replyContextRow}> + <View style={styles.replyContextLeft}> + {!isFirst ? <View style={[styles.lineTop, styles.lineUser]} /> : null} + {!isLast ? <View style={[styles.lineBottom, styles.lineUser]} /> : null} + <View style={[styles.ball, entry.isAI ? styles.ballAi : styles.ballUser]}> + {entry.isAI ? <AiSparkle /> : null} + </View> + </View> + <View + style={[ + styles.replyContextRight, + isLast && styles.replyContextRightLast, + ]} + > + <View style={styles.replyContextHeader}> + <View style={styles.replyContextBody}> + <Text style={[styles.replyContextText, entry.isAI ? styles.entryTextAi : null]}> + {getEntryPreview(entry)} + </Text> + {entry?.images?.length ? ( + <View style={styles.replyContextImages}> + {entry.images.map((uri, imageIndex) => ( + <Image + key={`${uri}-${imageIndex}`} + source={{ uri }} + style={styles.replyContextImage} + /> + ))} + </View> + ) : null} + </View> + <Text style={styles.replyContextMeta}> + {formatRelativeTime(entry.createdAt, t)} + </Text> + </View> + </View> + </View> + </View> + ); + })} + </ScrollView> + <View style={styles.replyModalDivider} /> + <View style={styles.replyModalComposer}> + <View style={styles.replyModalInputWrap}> + <TextInput + ref={replyInputRef} + value={replyText} + onChangeText={setReplyText} + placeholder={t('ideas.continuePlaceholder')} + style={styles.replyModalInput} + multiline + textAlignVertical="top" + placeholderTextColor={colors.mutedInk} + inputAccessoryViewID={Platform.OS === 'ios' ? replyAccessoryId : undefined} + /> + </View> + {replyImages.length > 0 ? ( + <View style={styles.imageRow}> + {replyImages.map((uri, index) => ( + <View key={`${uri}-${index}`} style={styles.imageItem}> + <Image source={{ uri }} style={styles.imageThumb} /> + <Pressable + style={styles.imageRemove} + onPress={() => removeImage('reply', index)} + > + <Text style={styles.imageRemoveText}>×</Text> + </Pressable> + </View> + ))} + </View> + ) : null} + {Platform.OS !== 'ios' || !isKeyboardVisible ? ( + <View style={styles.replyModalActions}> + <Pressable + style={styles.imageButton} + onPress={() => pickImages('reply')} + accessibilityLabel={t('ideas.addImage')} + > + <ImageIcon /> + </Pressable> + </View> + ) : null} + </View> + </View> + </KeyboardAvoidingView> + </Screen> + </Modal> + {Platform.OS === 'ios' ? ( + <> + <InputAccessoryView nativeID={mainAccessoryId}> + <View style={styles.accessoryBar}> + <Pressable + style={styles.accessoryDone} + onPress={() => handleDismissKeyboard('main')} + > + <Ionicons name="chevron-down" size={14} color={colors.accent} /> + <Text style={styles.accessoryDoneText}>{t('common.hideKeyboard')}</Text> + </Pressable> + </View> + </InputAccessoryView> + <InputAccessoryView nativeID={replyAccessoryId}> + <View style={styles.replyAccessoryBar}> + <Pressable + style={styles.imageButton} + onPress={() => pickImages('reply')} + accessibilityLabel={t('ideas.addImage')} + > + <ImageIcon /> + </Pressable> + <Pressable + style={styles.accessoryDone} + onPress={() => handleDismissKeyboard('reply')} + > + <Ionicons name="chevron-down" size={14} color={colors.accent} /> + <Text style={styles.accessoryDoneText}>{t('common.hideKeyboard')}</Text> + </Pressable> + </View> + </InputAccessoryView> + </> + ) : null} + <Modal + transparent + visible={isMoveModalOpen} + animationType="fade" + onRequestClose={closeMoveModal} + > + <Animated.View + style={[ + styles.modalOverlay, + { opacity: moveAnim.interpolate({ inputRange: [0, 1], outputRange: [0, 1] }) }, + ]} + > + <Pressable style={StyleSheet.absoluteFillObject} onPress={closeMoveModal} /> + <Animated.View + style={[ + styles.modalContainer, + { transform: [{ translateY: moveAnim.interpolate({ inputRange: [0, 1], outputRange: [28, 0] }) }] }, + ]} + > + <View style={styles.modalSheet}> + <Text style={styles.modalTitle}>{t('ideas.boxMoveTitle')}</Text> + <Text style={styles.modalSubtitle}>{t('ideas.boxMoveHint')}</Text> + <View style={styles.modalDivider} /> + <ScrollView + style={styles.modalList} + contentContainerStyle={styles.modalListContent} + showsVerticalScrollIndicator={false} + > + {[...boxes].sort((a, b) => { + if (a === selectedBox) return -1; + if (b === selectedBox) return 1; + if (a === DEFAULT_BOX) return -1; + if (b === DEFAULT_BOX) return 1; + return a.localeCompare(b); + }).map((box, index) => { + const isCurrent = box === selectedBox; + const label = box === DEFAULT_BOX ? t('ideas.boxInbox') : box; + return ( + <Pressable + key={box} + onPress={() => handleMoveThread(box)} + disabled={isCurrent} + style={[ + styles.modalItem, + index === 0 && styles.modalItemFirst, + isCurrent && styles.modalItemDisabled, + ]} + > + <View style={styles.modalItemRow}> + <Text style={[styles.modalItemText, isCurrent && styles.modalItemTextDisabled]}> + {label} + </Text> + {isCurrent ? ( + <View style={styles.modalBadge}> + <Text style={styles.modalBadgeText}>{t('ideas.boxCurrent')}</Text> + </View> + ) : null} + </View> + </Pressable> + ); + })} + </ScrollView> + </View> + <Pressable style={styles.modalCancelSheet} onPress={closeMoveModal}> + <Text style={styles.modalCancelText}>{t('common.cancel')}</Text> + </Pressable> + </Animated.View> + </Animated.View> + </Modal> + </Screen> + ); +} + +function buildSections(threads) { + const threadsWithLatest = threads.map((thread) => { + const latestEntry = thread.entries[thread.entries.length - 1]; + return { + ...thread, + latestTime: latestEntry?.createdAt ? new Date(latestEntry.createdAt).getTime() : 0, + }; + }); + + const sortedThreads = [...threadsWithLatest].sort((a, b) => b.latestTime - a.latestTime); + const entriesByDate = new Map(); + + sortedThreads.forEach((thread) => { + const firstEntry = thread.entries[0]; + const date = formatDateKey(firstEntry?.createdAt || new Date()); + if (!entriesByDate.has(date)) { + entriesByDate.set(date, []); + } + thread.entries.forEach((entry, index) => { + entriesByDate.get(date).push({ + ...entry, + threadId: thread.id, + threadTitle: thread.title, + isFirstInThread: index === 0, + isLastInThread: index === thread.entries.length - 1, + type: entry.isAI ? 'ai' : 'user', + }); + }); + }); + + return Array.from(entriesByDate.entries()) + .sort((a, b) => (a[0] < b[0] ? 1 : -1)) + .map(([dateKey, data]) => ({ + dateKey, + data, + })); +} + +function AiSparkle() { + return ( + <View style={styles.aiSparkle}> + <View style={[styles.sparkleLine, styles.sparkleLineH]} /> + <View style={[styles.sparkleLine, styles.sparkleLineV]} /> + <View style={[styles.sparkleLine, styles.sparkleLineD1]} /> + <View style={[styles.sparkleLine, styles.sparkleLineD2]} /> + </View> + ); +} + +function ImageIcon() { + return ( + <View style={styles.imageIcon}> + <View style={styles.imageIconFrame} /> + <View style={styles.imageIconSun} /> + <View style={styles.imageIconHillLeft} /> + <View style={styles.imageIconHillRight} /> + <View style={styles.imageIconBadge}> + <View style={styles.imageIconPlusH} /> + <View style={styles.imageIconPlusV} /> + </View> + </View> + ); +} + +function AnimatedEntry({ isActive, children }) { + const opacity = React.useRef(new Animated.Value(isActive ? 0 : 1)).current; + const translateY = React.useRef(new Animated.Value(isActive ? 10 : 0)).current; + const hasAnimatedRef = React.useRef(false); + + React.useEffect(() => { + if (!isActive || hasAnimatedRef.current) return; + hasAnimatedRef.current = true; + opacity.setValue(0); + translateY.setValue(10); + Animated.timing(opacity, { + toValue: 1, + duration: 360, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + Animated.timing(translateY, { + toValue: 0, + duration: 360, + easing: Easing.out(Easing.cubic), + useNativeDriver: true, + }).start(); + }, [isActive, opacity, translateY]); + + return ( + <Animated.View style={{ opacity, transform: [{ translateY }] }}> + {children} + </Animated.View> + ); +} + +const styles = StyleSheet.create({ + flex: { + flex: 1, + }, + header: { + marginBottom: spacing.md, + }, + headerRow: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: spacing.sm, + }, + heading: { + ...typography.title, + fontSize: 28, + fontWeight: '700', + }, + boxRowContent: { + flexDirection: 'row', + gap: spacing.sm, + paddingBottom: spacing.xs, + }, + boxChip: { + paddingHorizontal: spacing.md, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#f4f1ed', + borderWidth: 1, + borderColor: 'transparent', + }, + boxChipActive: { + backgroundColor: colors.paper, + borderColor: colors.accent, + }, + boxChipText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + color: colors.mutedInk, + }, + boxChipTextActive: { + color: colors.ink, + fontWeight: '600', + }, + boxAddButton: { + width: 28, + height: 28, + borderRadius: 14, + borderWidth: 1, + borderColor: colors.border, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: colors.paper, + }, + boxAddText: { + fontSize: 16, + color: colors.mutedInk, + fontWeight: '600', + }, + boxAddChip: { + paddingHorizontal: spacing.md, + paddingVertical: 6, + borderRadius: 999, + borderWidth: 1, + borderColor: colors.border, + backgroundColor: colors.paper, + }, + boxAddChipText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + color: colors.mutedInk, + }, + subhead: { + ...typography.subtitle, + marginTop: spacing.xs, + }, + composer: { + marginBottom: spacing.lg, + paddingVertical: spacing.xs, + }, + prompt: { + ...typography.subtitle, + color: colors.mutedInk, + marginBottom: spacing.xs, + }, + input: { + ...typography.body, + lineHeight: 24, + paddingVertical: spacing.xs, + }, + imageRow: { + flexDirection: 'row', + flexWrap: 'wrap', + marginTop: spacing.sm, + }, + imageItem: { + marginRight: spacing.sm, + marginBottom: spacing.sm, + }, + imageThumb: { + width: 84, + height: 84, + borderRadius: 12, + backgroundColor: '#f3f4f6', + }, + imageRemove: { + position: 'absolute', + top: -6, + right: -6, + width: 20, + height: 20, + borderRadius: 10, + backgroundColor: '#ffffff', + borderWidth: 1, + borderColor: '#e5e7eb', + alignItems: 'center', + justifyContent: 'center', + }, + imageRemoveText: { + fontSize: 12, + color: colors.mutedInk, + fontWeight: '600', + }, + composerActions: { + marginTop: spacing.sm, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + imageButton: { + alignSelf: 'flex-start', + paddingHorizontal: spacing.sm, + paddingVertical: spacing.sm, + borderRadius: 999, + backgroundColor: '#f2f0ed', + alignItems: 'center', + justifyContent: 'center', + }, + imageIcon: { + width: 18, + height: 18, + }, + imageIconFrame: { + position: 'absolute', + top: 2, + left: 2, + width: 14, + height: 12, + borderWidth: 1.4, + borderColor: colors.mutedInk, + borderRadius: 3, + }, + imageIconSun: { + position: 'absolute', + width: 3, + height: 3, + borderRadius: 1.5, + backgroundColor: colors.mutedInk, + top: 5, + left: 5, + }, + imageIconHillLeft: { + position: 'absolute', + width: 7, + height: 1.4, + backgroundColor: colors.mutedInk, + left: 5, + bottom: 6, + transform: [{ rotate: '-25deg' }], + }, + imageIconHillRight: { + position: 'absolute', + width: 6, + height: 1.4, + backgroundColor: colors.mutedInk, + left: 9, + bottom: 6, + transform: [{ rotate: '25deg' }], + }, + imageIconBadge: { + position: 'absolute', + right: 0, + bottom: 0, + width: 8, + height: 8, + borderRadius: 4, + backgroundColor: colors.accent, + alignItems: 'center', + justifyContent: 'center', + }, + imageIconPlusH: { + position: 'absolute', + width: 4, + height: 1.2, + backgroundColor: '#ffffff', + borderRadius: 1, + }, + imageIconPlusV: { + position: 'absolute', + width: 1.2, + height: 4, + backgroundColor: '#ffffff', + borderRadius: 1, + }, + publishButtonDisabled: { + opacity: 0.5, + }, + publishButton: { + backgroundColor: '#f2f0ed', + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + borderRadius: 999, + }, + publishText: { + ...typography.subtitle, + fontWeight: '600', + color: '#8b5a3c', + }, + listWrapper: { + flex: 1, + }, + list: { + paddingBottom: spacing.xl, + paddingTop: spacing.sm, + paddingRight: spacing.md, + }, + sectionHeader: { + flexDirection: 'row', + alignItems: 'center', + gap: spacing.sm, + marginBottom: spacing.md, + paddingTop: spacing.xs, + paddingBottom: spacing.sm, + }, + sectionTitle: { + ...typography.label, + color: colors.mutedInk, + }, + sectionLine: { + flex: 1, + height: 1, + backgroundColor: colors.border, + }, + entryRow: { + flexDirection: 'row', + gap: spacing.md, + }, + entryBlockLast: { + marginBottom: spacing.md, + }, + leftCol: { + width: 24, + alignItems: 'center', + position: 'relative', + }, + lineTop: { + position: 'absolute', + top: 0, + height: 4, + width: 2, + left: 11, + }, + lineBottom: { + position: 'absolute', + top: 28, + bottom: 0, + width: 2, + left: 11, + }, + lineUser: { + backgroundColor: '#d6d3d1', + }, + ball: { + width: 16, + height: 16, + borderRadius: 8, + marginTop: 6, + alignItems: 'center', + justifyContent: 'center', + }, + ballUser: { + backgroundColor: '#f59e7a', + }, + ballAi: { + backgroundColor: '#fed7aa', + }, + ballReply: { + backgroundColor: '#f59e7a', + }, + aiSparkle: { + width: 8, + height: 8, + }, + sparkleLine: { + position: 'absolute', + backgroundColor: '#ffffff', + borderRadius: 1, + }, + sparkleLineH: { + width: 8, + height: 1, + top: 3.5, + left: 0, + }, + sparkleLineV: { + width: 1, + height: 8, + left: 3.5, + top: 0, + }, + sparkleLineD1: { + width: 6, + height: 1, + left: 1, + top: 3.5, + transform: [{ rotate: '45deg' }], + }, + sparkleLineD2: { + width: 6, + height: 1, + left: 1, + top: 3.5, + transform: [{ rotate: '-45deg' }], + }, + entryRight: { + flex: 1, + paddingBottom: spacing.lg, + paddingTop: 2, + }, + entryHeader: { + flexDirection: 'row', + alignItems: 'flex-start', + gap: spacing.md, + }, + entryBody: { + flex: 1, + }, + entryImages: { + flexDirection: 'row', + flexWrap: 'wrap', + marginTop: spacing.sm, + }, + entryImage: { + width: 140, + height: 140, + borderRadius: 14, + marginRight: spacing.sm, + marginBottom: spacing.sm, + backgroundColor: '#f3f4f6', + }, + entryText: { + ...typography.body, + lineHeight: 24, + color: '#111827', + }, + entryTextAi: { + ...typography.subtitle, + color: '#6b7280', + }, + entryMetaRow: { + flexDirection: 'row', + alignItems: 'center', + gap: spacing.xs, + }, + entryMeta: { + ...typography.label, + }, + continueText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: '#c4551a', + }, + continueButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 999, + backgroundColor: '#fff1e6', + }, + actionRow: { + flexDirection: 'row', + gap: spacing.sm, + marginTop: spacing.sm, + alignItems: 'center', + }, + swipeActions: { + width: 80, + justifyContent: 'stretch', + alignItems: 'stretch', + paddingLeft: spacing.sm, + }, + swipeDelete: { + flex: 1, + alignItems: 'center', + justifyContent: 'center', + backgroundColor: '#ff3b30', + }, + swipeDeletePressable: { + flex: 1, + }, + swipeDeleteText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + color: '#ffffff', + fontWeight: '600', + }, + aiButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 999, + backgroundColor: '#f2f0ed', + }, + aiText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: '#8b5a3c', + }, + moveButton: { + alignSelf: 'flex-start', + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 999, + backgroundColor: '#eef2f7', + }, + moveText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: colors.mutedInk, + }, + modalOverlay: { + flex: 1, + backgroundColor: 'rgba(15, 23, 42, 0.35)', + justifyContent: 'flex-end', + }, + modalContainer: { + paddingHorizontal: spacing.md, + paddingBottom: spacing.lg, + }, + modalSheet: { + backgroundColor: colors.paper, + borderRadius: 18, + paddingTop: spacing.md, + overflow: 'hidden', + }, + modalTitle: { + ...typography.subtitle, + fontSize: 15, + fontWeight: '600', + color: colors.ink, + textAlign: 'center', + }, + modalSubtitle: { + ...typography.subtitle, + marginTop: 4, + marginBottom: spacing.sm, + textAlign: 'center', + }, + modalDivider: { + height: StyleSheet.hairlineWidth, + backgroundColor: colors.border, + }, + modalList: { + maxHeight: 260, + }, + modalListContent: { + paddingBottom: spacing.xs, + }, + modalItem: { + paddingVertical: spacing.sm + 2, + paddingHorizontal: spacing.lg, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: colors.paper, + borderTopWidth: StyleSheet.hairlineWidth, + borderColor: colors.border, + }, + modalItemFirst: { + borderTopWidth: 0, + }, + modalItemRow: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + gap: spacing.sm, + }, + modalItemDisabled: { + opacity: 0.5, + }, + modalItemText: { + ...typography.body, + fontSize: 15, + color: colors.ink, + }, + modalItemTextDisabled: { + color: colors.mutedInk, + }, + modalBadge: { + paddingHorizontal: 8, + paddingVertical: 2, + borderRadius: 999, + backgroundColor: '#f1f5f9', + }, + modalBadgeText: { + ...typography.label, + fontSize: 10, + color: colors.mutedInk, + letterSpacing: 0.4, + }, + modalItemSecondary: { + ...typography.body, + fontSize: 15, + color: colors.accent, + fontWeight: '600', + }, + modalCancelSheet: { + marginTop: spacing.sm, + backgroundColor: colors.paper, + borderRadius: 18, + alignItems: 'center', + paddingVertical: spacing.sm + 2, + }, + modalCancelText: { + ...typography.body, + fontSize: 16, + color: colors.ink, + fontWeight: '600', + }, + replyModalRoot: { + flex: 1, + }, + replyModalHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: spacing.sm, + }, + replyModalCancel: { + paddingHorizontal: 6, + paddingVertical: 4, + }, + replyModalCancelText: { + ...typography.subtitle, + fontSize: 12, + color: colors.mutedInk, + }, + replyModalTitle: { + ...typography.subtitle, + fontSize: 15, + fontWeight: '600', + color: colors.ink, + }, + replyModalPublish: { + paddingHorizontal: 12, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#fce8db', + }, + replyModalPublishDisabled: { + opacity: 0.5, + }, + replyModalPublishText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: colors.accent, + fontWeight: '600', + }, + replyModalBody: { + flex: 1, + }, + replyModalContext: { + flexGrow: 0, + maxHeight: 220, + }, + replyModalContextCompact: { + maxHeight: 120, + }, + replyModalContextContent: { + paddingBottom: spacing.xs, + }, + replyModalDivider: { + height: 0, + backgroundColor: 'transparent', + }, + replyContextItem: { + paddingBottom: 0, + }, + replyContextRow: { + flexDirection: 'row', + gap: spacing.sm, + }, + replyContextLeft: { + width: 24, + alignItems: 'center', + position: 'relative', + }, + replyContextRight: { + flex: 1, + paddingTop: 2, + paddingBottom: spacing.lg, + }, + replyContextRightLast: { + paddingBottom: spacing.sm, + }, + replyContextHeader: { + flexDirection: 'row', + alignItems: 'flex-start', + gap: spacing.sm, + }, + replyContextBody: { + flex: 1, + }, + replyContextText: { + ...typography.body, + color: colors.ink, + lineHeight: 22, + }, + replyContextImages: { + flexDirection: 'row', + flexWrap: 'wrap', + marginTop: spacing.sm, + }, + replyContextImage: { + width: 96, + height: 96, + borderRadius: 14, + backgroundColor: '#f3f4f6', + marginRight: spacing.sm, + marginBottom: spacing.sm, + }, + replyContextMeta: { + ...typography.label, + color: colors.mutedInk, + }, + replyModalComposer: { + flex: 1, + paddingTop: spacing.xs, + }, + replyModalInputWrap: { + flex: 1, + backgroundColor: '#f7f4f1', + borderRadius: 16, + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + }, + replyModalInput: { + ...typography.body, + minHeight: 200, + flex: 1, + lineHeight: 22, + paddingVertical: 0, + textAlignVertical: 'top', + }, + replyModalActions: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginTop: spacing.sm, + }, + accessoryBar: { + paddingHorizontal: spacing.lg, + paddingVertical: spacing.sm, + borderTopWidth: 1, + borderTopColor: colors.border, + backgroundColor: colors.paper, + flexDirection: 'row', + justifyContent: 'flex-end', + alignItems: 'center', + }, + accessoryDone: { + paddingHorizontal: 10, + paddingVertical: 4, + borderRadius: 10, + flexDirection: 'row', + alignItems: 'center', + gap: 4, + }, + accessoryDoneText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + color: colors.accent, + fontWeight: '600', + }, + replyAccessoryBar: { + paddingHorizontal: spacing.lg, + paddingVertical: spacing.sm, + borderTopWidth: 1, + borderTopColor: colors.border, + backgroundColor: colors.paper, + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + }, + replyRow: { + flexDirection: 'row', + gap: spacing.md, + paddingBottom: spacing.lg, + }, + replyBody: { + flex: 1, + }, + replyInput: { + ...typography.body, + minHeight: 72, + lineHeight: 22, + paddingVertical: spacing.sm, + }, + replyFooter: { + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + marginTop: spacing.xs, + }, + replyActions: { + flexDirection: 'row', + justifyContent: 'flex-end', + gap: spacing.md, + }, + replyButtonGhost: { + paddingHorizontal: 12, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#f4f1ed', + }, + replyCancel: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: colors.mutedInk, + }, + replyButtonPrimary: { + paddingHorizontal: 12, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#fce8db', + }, + replySubmit: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: colors.accent, + fontWeight: '600', + }, + aiThinkingRow: { + flexDirection: 'row', + alignItems: 'center', + gap: spacing.sm, + marginTop: 2, + }, + aiThinkingText: { + ...typography.subtitle, + color: colors.mutedInk, + }, + aiErrorBox: { + paddingVertical: spacing.sm, + }, + aiErrorText: { + ...typography.subtitle, + color: '#b42318', + }, + aiErrorActions: { + flexDirection: 'row', + gap: spacing.md, + marginTop: spacing.sm, + }, + reflectionInput: { + ...typography.body, + minHeight: 90, + lineHeight: 22, + paddingVertical: spacing.sm, + }, + reflectionFooter: { + marginTop: spacing.sm, + }, + reflectionHint: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 10, + color: colors.mutedInk, + marginBottom: spacing.xs, + }, +}); + +module.exports = IdeasScreen; diff --git a/src-ios/screens/SettingsScreen.js b/src-ios/screens/SettingsScreen.js new file mode 100644 index 0000000..155f82a --- /dev/null +++ b/src-ios/screens/SettingsScreen.js @@ -0,0 +1,343 @@ +const React = require('react'); +const { + View, + Text, + StyleSheet, + Pressable, + TextInput, + ScrollView, + KeyboardAvoidingView, + Keyboard, + Platform, + Alert, +} = require('react-native'); +const { useTranslation } = require('react-i18next'); +const { useFocusEffect } = require('@react-navigation/native'); +const Screen = require('../components/Screen'); +const Card = require('../components/Card'); +const { setLanguage, getLanguage } = require('../i18n'); +const { loadAIConfig, saveAIConfig } = require('../services/ai'); +const { typography, spacing, colors } = require('../theme'); + +function SettingsScreen() { + const { t, i18n } = useTranslation(); + const [lang, setLang] = React.useState(i18n.language); + const [aiConfig, setAiConfig] = React.useState({ + apiBase: '', + model: '', + apiKey: '', + prompt: '', + }); + const [isEditingAI, setIsEditingAI] = React.useState(false); + const [saving, setSaving] = React.useState(false); + const [saveStatus, setSaveStatus] = React.useState('idle'); + const saveTimeoutRef = React.useRef(null); + + React.useEffect(() => { + getLanguage().then((value) => { + if (value) { + setLang(value); + } + }); + loadAIConfig().then((config) => { + setAiConfig(config); + }); + }, []); + + useFocusEffect( + React.useCallback(() => { + Keyboard.dismiss(); + return undefined; + }, []), + ); + + const renderReadonlyValue = (value, placeholder, opts = {}) => { + const text = value && value.length > 0 ? value : placeholder; + return ( + <Text + style={[ + styles.readonlyText, + !value && styles.readonlyPlaceholder, + opts.isMultiline && styles.readonlyMultiline, + ]} + numberOfLines={opts.isMultiline ? 3 : 1} + > + {text} + </Text> + ); + }; + + const changeLang = async (value) => { + await setLanguage(value); + setLang(value); + }; + + const handleSaveAI = async () => { + setSaving(true); + try { + const next = await saveAIConfig(aiConfig); + setAiConfig(next); + setSaveStatus('saved'); + setIsEditingAI(false); + Keyboard.dismiss(); + if (saveTimeoutRef.current) { + clearTimeout(saveTimeoutRef.current); + } + saveTimeoutRef.current = setTimeout(() => { + setSaveStatus('idle'); + }, 1200); + } catch (err) { + Alert.alert(t('settings.saveFailed')); + } finally { + setSaving(false); + } + }; + + return ( + <Screen> + <KeyboardAvoidingView behavior={Platform.OS === 'ios' ? 'padding' : undefined} style={styles.flex}> + <ScrollView + contentContainerStyle={styles.scrollContent} + keyboardShouldPersistTaps="handled" + keyboardDismissMode="on-drag" + onScrollBeginDrag={() => Keyboard.dismiss()} + showsVerticalScrollIndicator={false} + > + <Text style={styles.heading}>{t('settings.title')}</Text> + <Card style={[styles.card, styles.cardFlat]}> + <Text style={styles.label}>{t('settings.language')}</Text> + <View style={styles.row}> + <Pressable onPress={() => changeLang('zh')} style={lang === 'zh' ? styles.active : styles.inactive}> + <Text style={styles.option}>中文</Text> + </Pressable> + <Pressable onPress={() => changeLang('en')} style={lang === 'en' ? styles.active : styles.inactive}> + <Text style={styles.option}>English</Text> + </Pressable> + </View> + </Card> + <Card style={[styles.card, styles.cardFlat]}> + <View style={styles.cardHeader}> + <Text style={[styles.label, styles.cardHeaderLabel]}>{t('settings.aiTitle')}</Text> + {!isEditingAI ? ( + <Pressable style={styles.editButton} onPress={() => setIsEditingAI(true)}> + <Text style={styles.editButtonText}>{t('common.edit')}</Text> + </Pressable> + ) : null} + </View> + <View style={styles.field}> + <Text style={styles.fieldLabel}>{t('settings.aiModel')}</Text> + {isEditingAI ? ( + <TextInput + value={aiConfig.model} + onChangeText={(value) => setAiConfig((prev) => ({ ...prev, model: value }))} + placeholder="gpt-4o" + style={styles.input} + autoCapitalize="none" + /> + ) : ( + <View style={styles.readonlyField}> + {renderReadonlyValue(aiConfig.model, 'gpt-4o')} + </View> + )} + </View> + <View style={styles.field}> + <Text style={styles.fieldLabel}>{t('settings.aiApiBase')}</Text> + {isEditingAI ? ( + <TextInput + value={aiConfig.apiBase} + onChangeText={(value) => setAiConfig((prev) => ({ ...prev, apiBase: value }))} + placeholder="https://api.openai.com/v1" + style={styles.input} + autoCapitalize="none" + /> + ) : ( + <View style={styles.readonlyField}> + {renderReadonlyValue(aiConfig.apiBase, 'https://api.openai.com/v1')} + </View> + )} + </View> + <View style={styles.field}> + <Text style={styles.fieldLabel}>{t('settings.aiApiKey')}</Text> + {isEditingAI ? ( + <TextInput + value={aiConfig.apiKey} + onChangeText={(value) => setAiConfig((prev) => ({ ...prev, apiKey: value }))} + placeholder="sk-..." + style={styles.input} + autoCapitalize="none" + secureTextEntry + /> + ) : ( + <View style={styles.readonlyField}> + {renderReadonlyValue(aiConfig.apiKey ? '••••••••••' : '', 'sk-...')} + </View> + )} + </View> + <View style={styles.field}> + <Text style={styles.fieldLabel}>{t('settings.aiPrompt')}</Text> + {isEditingAI ? ( + <TextInput + value={aiConfig.prompt} + onChangeText={(value) => setAiConfig((prev) => ({ ...prev, prompt: value }))} + placeholder={t('settings.aiPromptPlaceholder')} + style={styles.textarea} + multiline + textAlignVertical="top" + /> + ) : ( + <View style={[styles.readonlyField, styles.readonlyFieldMultiline]}> + {renderReadonlyValue(aiConfig.prompt, t('settings.aiPromptPlaceholder'), { isMultiline: true })} + </View> + )} + </View> + {isEditingAI ? ( + <Pressable style={styles.saveButton} onPress={handleSaveAI} disabled={saving}> + <Text style={styles.saveText}> + {saving ? t('settings.saving') : saveStatus === 'saved' ? t('settings.saved') : t('common.save')} + </Text> + </Pressable> + ) : null} + </Card> + <Card style={[styles.card, styles.cardFlat]}> + <Text style={styles.label}>OpenContext</Text> + <Text style={styles.about}>{t('settings.about')}</Text> + </Card> + </ScrollView> + </KeyboardAvoidingView> + </Screen> + ); +} + +const styles = StyleSheet.create({ + flex: { + flex: 1, + }, + scrollContent: { + paddingBottom: spacing.xl, + }, + heading: { + ...typography.title, + marginBottom: spacing.lg, + }, + card: { + marginBottom: spacing.md, + }, + cardFlat: { + shadowColor: 'transparent', + shadowOpacity: 0, + shadowRadius: 0, + shadowOffset: { width: 0, height: 0 }, + elevation: 0, + }, + label: { + ...typography.label, + marginBottom: spacing.sm, + }, + cardHeader: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + marginBottom: spacing.sm, + }, + cardHeaderLabel: { + marginBottom: 0, + }, + editButton: { + paddingHorizontal: 12, + paddingVertical: 6, + borderRadius: 999, + backgroundColor: '#f4f1ed', + }, + editButtonText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 11, + color: colors.mutedInk, + }, + row: { + flexDirection: 'row', + gap: spacing.sm, + }, + field: { + marginBottom: spacing.md, + }, + fieldLabel: { + ...typography.subtitle, + color: colors.mutedInk, + marginBottom: spacing.xs, + }, + input: { + ...typography.body, + borderWidth: 1, + borderColor: colors.border, + borderRadius: 12, + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + backgroundColor: colors.paper, + }, + textarea: { + ...typography.body, + borderWidth: 1, + borderColor: colors.border, + borderRadius: 12, + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + minHeight: 90, + backgroundColor: colors.paper, + }, + readonlyField: { + borderRadius: 12, + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + backgroundColor: '#f4f1ed', + }, + readonlyFieldMultiline: { + minHeight: 90, + justifyContent: 'flex-start', + }, + readonlyText: { + ...typography.body, + color: colors.ink, + }, + readonlyPlaceholder: { + color: colors.mutedInk, + }, + readonlyMultiline: { + lineHeight: 20, + }, + saveButton: { + alignSelf: 'flex-start', + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + borderRadius: 999, + backgroundColor: '#fce8db', + }, + saveText: { + fontFamily: typography.subtitle.fontFamily, + fontSize: 12, + color: colors.accent, + fontWeight: '600', + }, + option: { + ...typography.body, + }, + active: { + paddingVertical: spacing.sm, + paddingHorizontal: spacing.md, + borderRadius: 12, + backgroundColor: colors.paper, + borderWidth: 1, + borderColor: colors.accent, + }, + inactive: { + paddingVertical: spacing.sm, + paddingHorizontal: spacing.md, + borderRadius: 12, + borderWidth: 1, + borderColor: colors.border, + }, + about: { + ...typography.subtitle, + }, +}); + +module.exports = SettingsScreen; diff --git a/src-ios/services/ai.js b/src-ios/services/ai.js new file mode 100644 index 0000000..6e691f6 --- /dev/null +++ b/src-ios/services/ai.js @@ -0,0 +1,95 @@ +const AsyncStorage = require('@react-native-async-storage/async-storage').default; + +const CONFIG_KEY = '@opencontext/aiConfig'; +const DEFAULT_PROMPT = + 'You are an AI within a journaling app. Your job is to help the user reflect on their thoughts in a thoughtful and kind manner. The user can never directly address you or directly respond to you. Try not to repeat what the user said, instead try to seed new ideas, encourage or debate. Keep your responses concise, but meaningful.'; + +const DEFAULT_CONFIG = { + apiBase: 'https://api.openai.com/v1', + model: 'gpt-4o', + apiKey: '', + prompt: DEFAULT_PROMPT, +}; + +async function loadAIConfig() { + const raw = await AsyncStorage.getItem(CONFIG_KEY); + if (!raw) return { ...DEFAULT_CONFIG }; + try { + const parsed = JSON.parse(raw); + return { ...DEFAULT_CONFIG, ...parsed }; + } catch { + return { ...DEFAULT_CONFIG }; + } +} + +async function saveAIConfig(updates) { + const current = await loadAIConfig(); + const next = { ...current, ...updates }; + await AsyncStorage.setItem(CONFIG_KEY, JSON.stringify(next)); + return next; +} + +function isAIAvailable(config) { + if (!config) return false; + return Boolean(config.apiKey); +} + +function resolveLanguageLabel(lang) { + if (!lang) return 'English'; + if (lang.startsWith('zh')) return 'Chinese (简体中文)'; + if (lang.startsWith('en')) return 'English'; + return lang; +} + +function buildMessages(entries, config, lang) { + const language = resolveLanguageLabel(lang); + const messages = [ + { role: 'system', content: config.prompt }, + { role: 'system', content: 'You can only respond in plaintext, do NOT use HTML or Markdown formatting.' }, + { role: 'system', content: `IMPORTANT: You MUST respond in ${language}. This is the user's preferred language.` }, + ]; + + entries.forEach((entry) => { + const text = entry?.content || entry?.text || ''; + messages.push({ role: 'user', content: text }); + }); + + return messages; +} + +async function generateReflection(entries, options = {}) { + const config = options.config || await loadAIConfig(); + if (!isAIAvailable(config)) { + throw new Error('AI not configured'); + } + + const messages = buildMessages(entries, config, options.language); + const res = await fetch(`${config.apiBase}/chat/completions`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Authorization: config.apiKey ? `Bearer ${config.apiKey}` : undefined, + }, + body: JSON.stringify({ + model: config.model, + messages, + temperature: 0.7, + }), + }); + + if (!res.ok) { + const detail = await res.text(); + throw new Error(detail || `AI request failed (${res.status})`); + } + + const data = await res.json(); + const content = data?.choices?.[0]?.message?.content || ''; + return content.trim(); +} + +module.exports = { + loadAIConfig, + saveAIConfig, + isAIAvailable, + generateReflection, +}; diff --git a/src-ios/services/ideas.js b/src-ios/services/ideas.js new file mode 100644 index 0000000..9e4a17c --- /dev/null +++ b/src-ios/services/ideas.js @@ -0,0 +1,466 @@ +const FileSystem = require('expo-file-system'); +const { generateStableId } = require('../utils/uuid'); +const { joinPath } = require('../utils/paths'); + +const APP_ROOT = `${FileSystem.documentDirectory}opencontext/`; +const IDEAS_ROOT = `${APP_ROOT}.ideas/`; +const DEFAULT_BOX = 'inbox'; +const ENTRY_MARKER_REGEX = /^\[\/\/\]: # \(idea:id=([a-f0-9-]+) created_at=([^\s)]+)(?:\s+is_ai=(\w+))?\)\s*$/; + +async function ensureIdeasRoot() { + try { + await FileSystem.makeDirectoryAsync(IDEAS_ROOT, { intermediates: true }); + } catch { + // ignore + } + try { + await FileSystem.makeDirectoryAsync(joinPath(IDEAS_ROOT, DEFAULT_BOX), { intermediates: true }); + } catch { + // ignore + } +} + +function sanitizeBoxName(name) { + const value = String(name || '').trim(); + if (!value) return DEFAULT_BOX; + if (value.includes('/') || value.includes('\\')) return DEFAULT_BOX; + return value; +} + +function stripIdeasRoot(path) { + if (!path) return ''; + return path.startsWith('.ideas/') ? path.slice('.ideas/'.length) : path; +} + +function isLegacyThreadPath(relPath) { + const normalized = stripIdeasRoot(relPath); + const first = normalized.split('/').filter(Boolean)[0] || ''; + return /^\d{4}$/.test(first); +} + +function extractBoxFromPath(relPath) { + const normalized = stripIdeasRoot(relPath); + const parts = normalized.split('/').filter(Boolean); + if (!parts.length) return DEFAULT_BOX; + if (/^\d{4}$/.test(parts[0])) return DEFAULT_BOX; + return parts[0]; +} + +function generateEntryId() { + return generateStableId(); +} + +function createEntryMarker(id, createdAt, isAI = false) { + const base = `[//]: # (idea:id=${id} created_at=${createdAt}`; + return isAI ? `${base} is_ai=true)` : `${base})`; +} + +function parseEntryMarker(line) { + const match = line.match(ENTRY_MARKER_REGEX); + if (!match) return null; + return { + id: match[1], + createdAt: match[2], + isAI: match[3] === 'true', + }; +} + +function extractImagesFromContent(content) { + if (!content) return { text: '', images: [] }; + const images = []; + const imgRegex = /!\[[^\]]*\]\(([^)]+)\)/g; + let match; + while ((match = imgRegex.exec(content)) !== null) { + images.push(match[1]); + } + const text = content.replace(/!\[[^\]]*\]\([^)]+\)\n?/g, '').trim(); + return { text, images }; +} + +function addImagesToContent(text, images) { + if (!images || images.length === 0) return text; + const imageMarkdown = images.map((img, idx) => `![image-${idx + 1}](${img})`).join('\n'); + return text ? `${text}\n\n${imageMarkdown}` : imageMarkdown; +} + +function parseThreadDocument(content) { + if (!content) return []; + const lines = content.split('\n'); + const entries = []; + let currentEntry = null; + let contentLines = []; + + for (const line of lines) { + const marker = parseEntryMarker(line); + if (marker) { + if (currentEntry) { + const rawContent = contentLines.join('\n').trim(); + const { text, images } = extractImagesFromContent(rawContent); + currentEntry.content = text; + currentEntry.images = images; + entries.push(currentEntry); + } + currentEntry = { + id: marker.id, + createdAt: marker.createdAt, + content: '', + images: [], + isAI: marker.isAI || false, + }; + contentLines = []; + } else if (currentEntry) { + contentLines.push(line); + } + } + + if (currentEntry) { + const rawContent = contentLines.join('\n').trim(); + const { text, images } = extractImagesFromContent(rawContent); + currentEntry.content = text; + currentEntry.images = images; + entries.push(currentEntry); + } + + if (entries.length === 0 && content.trim()) { + entries.push({ + id: generateEntryId(), + createdAt: new Date().toISOString(), + content: content.trim(), + images: [], + isAI: false, + }); + } + + return entries; +} + +function serializeThreadDocument(entries) { + if (!entries || entries.length === 0) return ''; + return entries + .map((entry) => { + const marker = createEntryMarker(entry.id, entry.createdAt, entry.isAI); + const contentWithImages = addImagesToContent(entry.content, entry.images); + return `${marker}\n${contentWithImages}`; + }) + .join('\n\n'); +} + +function formatDateKey(dateInput) { + const d = dateInput instanceof Date ? dateInput : new Date(dateInput); + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +function slugify(text) { + return text + .toLowerCase() + .replace(/[^\w\u4e00-\u9fa5\s-]/g, '') + .replace(/\s+/g, '-') + .replace(/-+/g, '-') + .replace(/^-|-$/g, '') + .slice(0, 30) || 'thread'; +} + +function generateThreadPath(title, date = new Date(), box = DEFAULT_BOX) { + const d = date instanceof Date ? date : new Date(date); + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + const datePrefix = `${year}${month}${day}`; + const slug = slugify(title || ''); + const timestamp = Date.now().toString(36); + const safeBox = sanitizeBoxName(box); + return `${safeBox}/${year}/${month}/${datePrefix}-${slug}-${timestamp}.md`; +} + +function extractTitleFromPath(relPath) { + const filename = relPath.split('/').pop().replace('.md', ''); + const parts = filename.split('-'); + if (parts.length > 2) { + return parts.slice(1, -1).join(' '); + } + return filename; +} + +function extractDateFromPath(relPath) { + const filename = relPath.split('/').pop().replace('.md', ''); + const dateMatch = filename.match(/^(\d{4})(\d{2})(\d{2})/); + if (dateMatch) { + return `${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}`; + } + return null; +} + +async function listMarkdownFiles(dir, prefix = '') { + const items = await FileSystem.readDirectoryAsync(dir); + const result = []; + + for (const name of items) { + const absPath = joinPath(dir, name); + const info = await FileSystem.getInfoAsync(absPath); + if (info.isDirectory) { + const nestedPrefix = joinPath(prefix, name); + const nested = await listMarkdownFiles(absPath, nestedPrefix); + result.push(...nested); + } else if (name.endsWith('.md')) { + result.push(joinPath(prefix, name)); + } + } + + return result; +} + +async function migrateLegacyThreads() { + const files = await listMarkdownFiles(IDEAS_ROOT); + for (const relPath of files) { + if (!isLegacyThreadPath(relPath)) continue; + const fromPath = joinPath(IDEAS_ROOT, relPath); + const destRelPath = joinPath(DEFAULT_BOX, relPath); + const destPath = joinPath(IDEAS_ROOT, destRelPath); + const destFolder = destPath.split('/').slice(0, -1).join('/'); + try { + await FileSystem.makeDirectoryAsync(destFolder, { intermediates: true }); + await FileSystem.moveAsync({ from: fromPath, to: destPath }); + } catch { + // ignore failed migration + } + } +} + +async function listBoxes() { + await ensureIdeasRoot(); + const items = await FileSystem.readDirectoryAsync(IDEAS_ROOT); + const boxes = []; + for (const name of items) { + if (!name) continue; + const info = await FileSystem.getInfoAsync(joinPath(IDEAS_ROOT, name)); + if (!info.isDirectory) continue; + if (/^\d{4}$/.test(name)) continue; + boxes.push(name); + } + const unique = Array.from(new Set([DEFAULT_BOX, ...boxes])); + const rest = unique.filter((box) => box !== DEFAULT_BOX).sort(); + return [DEFAULT_BOX, ...rest]; +} + +function resolveThreadPaths(threadId) { + const relPath = stripIdeasRoot(threadId); + const absPath = joinPath(IDEAS_ROOT, relPath); + return { relPath, absPath, threadId: `.ideas/${relPath}` }; +} + +async function listThreads(options = {}) { + const { box } = options; + await ensureIdeasRoot(); + await migrateLegacyThreads(); + const files = await listMarkdownFiles(IDEAS_ROOT); + const threads = []; + + for (const relPath of files) { + const threadBox = extractBoxFromPath(relPath); + if (box && threadBox !== box) continue; + const absPath = joinPath(IDEAS_ROOT, relPath); + const content = await FileSystem.readAsStringAsync(absPath, { + encoding: FileSystem.EncodingType.UTF8, + }); + const entries = parseThreadDocument(content); + const threadId = `.ideas/${relPath}`; + const entriesWithThreadId = entries.map((entry) => ({ + ...entry, + threadId, + })); + const firstEntry = entriesWithThreadId[0]; + const lastEntry = entriesWithThreadId[entriesWithThreadId.length - 1]; + const createdAt = firstEntry?.createdAt || new Date().toISOString(); + const updatedAt = lastEntry?.createdAt || createdAt; + + threads.push({ + id: threadId, + title: extractTitleFromPath(relPath), + createdAt, + updatedAt, + entries: entriesWithThreadId, + _path: threadId, + _date: extractDateFromPath(relPath) || formatDateKey(createdAt), + _box: threadBox, + }); + } + + return threads; +} + +async function getThread(threadId) { + const { absPath, threadId: normalizedId } = resolveThreadPaths(threadId); + try { + const content = await FileSystem.readAsStringAsync(absPath, { + encoding: FileSystem.EncodingType.UTF8, + }); + const entries = parseThreadDocument(content).map((entry) => ({ + ...entry, + threadId: normalizedId, + })); + const firstEntry = entries[0]; + const lastEntry = entries[entries.length - 1]; + const createdAt = firstEntry?.createdAt || new Date().toISOString(); + const updatedAt = lastEntry?.createdAt || createdAt; + const relPath = stripIdeasRoot(normalizedId); + return { + id: normalizedId, + title: extractTitleFromPath(relPath), + createdAt, + updatedAt, + entries, + _path: normalizedId, + _date: extractDateFromPath(relPath) || formatDateKey(createdAt), + _box: extractBoxFromPath(relPath), + }; + } catch (err) { + return null; + } +} + +async function createThread({ content, title, isAI = false, images = [], box = DEFAULT_BOX }) { + await ensureIdeasRoot(); + const now = new Date().toISOString(); + const entryId = generateEntryId(); + const threadRelPath = generateThreadPath(title || content.slice(0, 20), new Date(), box); + const absPath = joinPath(IDEAS_ROOT, threadRelPath); + const folderPath = absPath.split('/').slice(0, -1).join('/'); + + await FileSystem.makeDirectoryAsync(folderPath, { intermediates: true }); + + const threadId = `.ideas/${threadRelPath}`; + const firstEntry = { + id: entryId, + threadId, + content, + images, + isAI, + createdAt: now, + }; + + const docContent = serializeThreadDocument([firstEntry]); + await FileSystem.writeAsStringAsync(absPath, docContent, { + encoding: FileSystem.EncodingType.UTF8, + }); + + return { + id: threadId, + title: extractTitleFromPath(threadRelPath), + createdAt: now, + updatedAt: now, + entries: [firstEntry], + _path: threadId, + _date: formatDateKey(now), + _box: extractBoxFromPath(threadRelPath), + }; +} + +async function continueThread({ threadId, content, isAI = false, images = [] }) { + const { absPath, threadId: normalizedId } = resolveThreadPaths(threadId); + const thread = await getThread(normalizedId); + if (!thread) { + throw new Error(`Thread not found: ${threadId}`); + } + + const now = new Date().toISOString(); + const entryId = generateEntryId(); + const newEntry = { + id: entryId, + threadId: normalizedId, + content, + images, + isAI, + createdAt: now, + }; + + const updatedEntries = [...thread.entries, newEntry]; + const docContent = serializeThreadDocument(updatedEntries); + await FileSystem.writeAsStringAsync(absPath, docContent, { + encoding: FileSystem.EncodingType.UTF8, + }); + + return newEntry; +} + +async function deleteEntry({ threadId, entryId }) { + const { absPath, threadId: normalizedId } = resolveThreadPaths(threadId); + const thread = await getThread(normalizedId); + if (!thread) return false; + + const updatedEntries = thread.entries.filter((entry) => entry.id !== entryId); + if (updatedEntries.length === 0) { + await FileSystem.deleteAsync(absPath, { idempotent: true }); + return true; + } + + const docContent = serializeThreadDocument(updatedEntries); + await FileSystem.writeAsStringAsync(absPath, docContent, { + encoding: FileSystem.EncodingType.UTF8, + }); + return true; +} + +async function deleteThread(threadId) { + const { absPath } = resolveThreadPaths(threadId); + await FileSystem.deleteAsync(absPath, { idempotent: true }); + return true; +} + +async function createBox(name) { + const safeName = sanitizeBoxName(name); + await ensureIdeasRoot(); + await FileSystem.makeDirectoryAsync(joinPath(IDEAS_ROOT, safeName), { intermediates: true }); + return safeName; +} + +async function renameBox(oldName, newName) { + const safeName = sanitizeBoxName(newName); + if (!oldName || oldName === safeName || oldName === DEFAULT_BOX) return oldName; + await ensureIdeasRoot(); + const fromPath = joinPath(IDEAS_ROOT, oldName); + const toPath = joinPath(IDEAS_ROOT, safeName); + await FileSystem.moveAsync({ from: fromPath, to: toPath }); + return safeName; +} + +async function deleteBox(name) { + if (!name || name === DEFAULT_BOX) return false; + const target = joinPath(IDEAS_ROOT, name); + await FileSystem.deleteAsync(target, { idempotent: true }); + return true; +} + +async function moveThread({ threadId, targetBox }) { + const safeBox = sanitizeBoxName(targetBox); + const { relPath, absPath } = resolveThreadPaths(threadId); + const currentBox = extractBoxFromPath(relPath); + if (currentBox === safeBox) { + return `.ideas/${relPath}`; + } + const restPath = isLegacyThreadPath(relPath) + ? relPath + : relPath.split('/').slice(1).join('/'); + const destRelPath = joinPath(safeBox, restPath); + const destPath = joinPath(IDEAS_ROOT, destRelPath); + const destFolder = destPath.split('/').slice(0, -1).join('/'); + await FileSystem.makeDirectoryAsync(destFolder, { intermediates: true }); + await FileSystem.moveAsync({ from: absPath, to: destPath }); + return `.ideas/${destRelPath}`; +} + +module.exports = { + listBoxes, + listThreads, + getThread, + createThread, + continueThread, + deleteEntry, + deleteThread, + createBox, + renameBox, + deleteBox, + moveThread, +}; diff --git a/src-ios/services/images.js b/src-ios/services/images.js new file mode 100644 index 0000000..15bdbd1 --- /dev/null +++ b/src-ios/services/images.js @@ -0,0 +1,32 @@ +const FileSystem = require('expo-file-system'); +const { generateStableId } = require('../utils/uuid'); + +const APP_ROOT = `${FileSystem.documentDirectory}opencontext/`; +const IMAGES_ROOT = `${APP_ROOT}images/`; + +async function ensureImagesRoot() { + await FileSystem.makeDirectoryAsync(IMAGES_ROOT, { intermediates: true }); +} + +function inferExtension(asset) { + const source = asset?.fileName || asset?.uri || ''; + const match = source.match(/\.([a-z0-9]+)(?:\?|$)/i); + if (match) { + return match[1].toLowerCase(); + } + return 'jpg'; +} + +async function importImageAsset(asset) { + if (!asset?.uri) return null; + await ensureImagesRoot(); + const ext = inferExtension(asset); + const name = `${Date.now().toString(36)}-${generateStableId().slice(0, 8)}.${ext}`; + const dest = `${IMAGES_ROOT}${name}`; + await FileSystem.copyAsync({ from: asset.uri, to: dest }); + return dest; +} + +module.exports = { + importImageAsset, +}; diff --git a/src-ios/theme.js b/src-ios/theme.js new file mode 100644 index 0000000..c5f13b6 --- /dev/null +++ b/src-ios/theme.js @@ -0,0 +1,52 @@ +const colors = { + paper: '#ffffff', + ink: '#1f1e1b', + mutedInk: '#6b7280', + accent: '#e76f2c', + border: '#e7e5e4', + card: '#ffffff', + shadow: '#000000', + gradientA: '#ffffff', + gradientB: '#ffffff', + gradientC: '#ffffff', +}; + +const spacing = { + xs: 6, + sm: 10, + md: 16, + lg: 24, + xl: 32, +}; + +const typography = { + title: { + fontFamily: 'Georgia', + fontSize: 24, + fontWeight: '600', + color: colors.ink, + }, + subtitle: { + fontFamily: 'Avenir', + fontSize: 14, + color: colors.mutedInk, + }, + body: { + fontFamily: 'Avenir', + fontSize: 16, + color: colors.ink, + }, + label: { + fontFamily: 'Avenir', + fontSize: 12, + letterSpacing: 0.6, + textTransform: 'uppercase', + color: colors.mutedInk, + }, +}; + +module.exports = { + colors, + spacing, + typography, +}; diff --git a/src-ios/utils/date.js b/src-ios/utils/date.js new file mode 100644 index 0000000..034aa09 --- /dev/null +++ b/src-ios/utils/date.js @@ -0,0 +1,15 @@ +function formatDate(iso, locale = 'zh') { + try { + const date = new Date(iso); + return new Intl.DateTimeFormat(locale, { + month: 'short', + day: 'numeric', + }).format(date); + } catch (err) { + return ''; + } +} + +module.exports = { + formatDate, +}; diff --git a/src-ios/utils/ideaTime.js b/src-ios/utils/ideaTime.js new file mode 100644 index 0000000..3848728 --- /dev/null +++ b/src-ios/utils/ideaTime.js @@ -0,0 +1,41 @@ +function formatDateKey(date) { + const d = new Date(date); + if (Number.isNaN(d.getTime())) return ''; + const year = d.getFullYear(); + const month = String(d.getMonth() + 1).padStart(2, '0'); + const day = String(d.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; +} + +function formatDateDisplay(dateKey, t) { + if (!dateKey) return t('time.today', 'Today'); + const today = formatDateKey(new Date()); + const yesterday = formatDateKey(new Date(Date.now() - 86400000)); + if (dateKey === today) return t('time.today', 'Today'); + if (dateKey === yesterday) return t('time.yesterday', 'Yesterday'); + try { + const date = new Date(dateKey); + return new Intl.DateTimeFormat(undefined, { month: 'short', day: 'numeric' }).format(date); + } catch (err) { + return dateKey; + } +} + +function formatRelativeTime(dateStr, t) { + const now = Date.now(); + const date = new Date(dateStr).getTime(); + if (!date) return ''; + const diffMs = now - date; + const diffMins = Math.floor(diffMs / 60000); + const diffHours = Math.floor(diffMins / 60); + if (diffMins < 1) return t('time.justNow', 'Just now'); + if (diffMins < 60) return t('time.minutesAgo', { count: diffMins }); + if (diffHours < 24) return t('time.hoursAgo', { count: diffHours }); + return formatDateDisplay(formatDateKey(dateStr), t); +} + +module.exports = { + formatDateKey, + formatDateDisplay, + formatRelativeTime, +}; diff --git a/src-ios/utils/paths.js b/src-ios/utils/paths.js new file mode 100644 index 0000000..2b5e8db --- /dev/null +++ b/src-ios/utils/paths.js @@ -0,0 +1,25 @@ +function joinPath(...parts) { + return parts + .filter((part) => typeof part === 'string' && part.length > 0) + .map((part, index) => { + if (index === 0) { + return part.replace(/\/+$/g, ''); + } + return part.replace(/^\/+/g, '').replace(/\/+$/g, ''); + }) + .join('/'); +} + +function resolveDocPaths({ documentsRoot, relPath }) { + const safeRelPath = String(relPath || '').replace(/^\/+/g, ''); + const absPath = joinPath(documentsRoot, safeRelPath); + return { + relPath: safeRelPath, + absPath, + }; +} + +module.exports = { + joinPath, + resolveDocPaths, +}; diff --git a/src-ios/utils/uuid.js b/src-ios/utils/uuid.js new file mode 100644 index 0000000..6cce0df --- /dev/null +++ b/src-ios/utils/uuid.js @@ -0,0 +1,37 @@ +function generateStableId() { + const bytes = randomBytes(16); + // UUID v4 variant/version bits + bytes[6] = (bytes[6] & 0x0f) | 0x40; + bytes[8] = (bytes[8] & 0x3f) | 0x80; + const hex = bytesToHex(bytes); + return ( + `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-` + + `${hex.slice(16, 20)}-${hex.slice(20, 32)}` + ); +} + +function randomBytes(length) { + const bytes = new Uint8Array(length); + const cryptoObj = typeof globalThis !== 'undefined' ? globalThis.crypto : null; + if (cryptoObj && typeof cryptoObj.getRandomValues === 'function') { + cryptoObj.getRandomValues(bytes); + return bytes; + } + for (let i = 0; i < length; i += 1) { + bytes[i] = Math.floor(Math.random() * 256); + } + return bytes; +} + +function bytesToHex(bytes) { + let hex = ''; + for (let i = 0; i < bytes.length; i += 1) { + const v = bytes[i].toString(16); + hex += v.length === 1 ? `0${v}` : v; + } + return hex; +} + +module.exports = { + generateStableId, +}; diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1ccea4b..8e4fc5f 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -9,7 +9,7 @@ edition = "2021" tauri-build = { version = "2", features = [] } [dependencies] -tauri = { version = "2", features = [] } +tauri = { version = "2", features = ["image-png", "tray-icon"] } tauri-plugin-shell = "2" tauri-plugin-clipboard-manager = "2" serde = { version = "1", features = ["derive"] } @@ -19,6 +19,7 @@ tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync"] } opencontext-core = { path = "../crates/opencontext-core", features = ["search"] } reqwest = { version = "0.12", features = ["json", "stream"] } futures = "0.3" +portable-pty = "0.8" [profile.release] panic = "abort" @@ -26,4 +27,3 @@ codegen-units = 1 lto = true opt-level = "s" strip = true - diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index dfb5406..9d50cf9 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -6,6 +6,31 @@ "permissions": [ "core:default", "shell:allow-open", + { + "identifier": "shell:allow-spawn", + "allow": [ + { + "name": "terminal-shell", + "cmd": "bash", + "args": true + }, + { + "name": "terminal-sh", + "cmd": "sh", + "args": true + }, + { + "name": "terminal-cmd", + "cmd": "cmd", + "args": true + }, + { + "name": "terminal-powershell", + "cmd": "powershell", + "args": true + } + ] + }, "clipboard-manager:allow-write-text", "clipboard-manager:allow-read-text", "core:window:default", @@ -17,7 +42,7 @@ "core:window:allow-unmaximize", "core:window:allow-toggle-maximize", "core:window:allow-set-size", - "core:window:allow-set-position" + "core:window:allow-set-position", + "core:window:allow-set-theme" ] } - diff --git a/src-tauri/icons/about-icon.png b/src-tauri/icons/about-icon.png new file mode 100644 index 0000000..2db8790 Binary files /dev/null and b/src-tauri/icons/about-icon.png differ diff --git a/src-tauri/icons/tray-icon-32.png b/src-tauri/icons/tray-icon-32.png new file mode 100644 index 0000000..af4d93e Binary files /dev/null and b/src-tauri/icons/tray-icon-32.png differ diff --git a/src-tauri/icons/tray-icon-template-36.png b/src-tauri/icons/tray-icon-template-36.png new file mode 100644 index 0000000..533e9aa Binary files /dev/null and b/src-tauri/icons/tray-icon-template-36.png differ diff --git a/src-tauri/icons/tray-icon-template-64.png b/src-tauri/icons/tray-icon-template-64.png new file mode 100644 index 0000000..20fb7bb Binary files /dev/null and b/src-tauri/icons/tray-icon-template-64.png differ diff --git a/src-tauri/src/agent_rpc.rs b/src-tauri/src/agent_rpc.rs new file mode 100644 index 0000000..3c9667a --- /dev/null +++ b/src-tauri/src/agent_rpc.rs @@ -0,0 +1,38 @@ +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +#[derive(Clone, Copy, PartialEq, Eq)] +pub(crate) enum AgentRpcKind { + CodexMcp, + ClaudeAcp, + OpenCodeAcp, +} + +pub(crate) struct AgentRpcSession { + pub(crate) kind: AgentRpcKind, + #[allow(dead_code)] + pub(crate) child: Arc<Mutex<std::process::Child>>, + pub(crate) stdin: Arc<Mutex<std::process::ChildStdin>>, + pub(crate) state: Arc<Mutex<AgentRpcState>>, + pub(crate) next_id: std::sync::atomic::AtomicU64, +} + +pub(crate) struct AgentRpcState { + pub(crate) pending_responses: + HashMap<u64, std::sync::mpsc::Sender<Result<serde_json::Value, String>>>, + pub(crate) request_map: HashMap<u64, String>, + pub(crate) active_request: Option<String>, + #[allow(dead_code)] + pub(crate) session_id: Option<String>, + pub(crate) model: Option<String>, + pub(crate) cwd: Option<String>, + pub(crate) conversation_id: Option<String>, + #[allow(dead_code)] + pub(crate) initialized: bool, + pub(crate) codex_session_started: bool, + pub(crate) codex_received_delta: bool, + pub(crate) codex_elicitation_map: HashMap<String, u64>, + pub(crate) codex_patch_changes: HashMap<String, serde_json::Value>, + pub(crate) acp_permission_map: HashMap<String, u64>, + pub(crate) startup_error: Option<String>, +} diff --git a/src-tauri/src/chat.rs b/src-tauri/src/chat.rs new file mode 100644 index 0000000..6996f7d --- /dev/null +++ b/src-tauri/src/chat.rs @@ -0,0 +1,104 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Deserialize, Serialize, Clone)] +pub(crate) struct ChatMessage { + pub(crate) role: String, + pub(crate) content: serde_json::Value, +} + +pub(crate) fn flatten_message_content(value: &serde_json::Value) -> String { + if value.is_null() { + return String::new(); + } + if let Some(s) = value.as_str() { + return s.to_string(); + } + if let Some(arr) = value.as_array() { + let mut parts: Vec<String> = Vec::new(); + for item in arr { + if let Some(s) = item.as_str() { + parts.push(s.to_string()); + continue; + } + if let Some(obj) = item.as_object() { + if let Some(text) = obj.get("text").and_then(|t| t.as_str()) { + parts.push(text.to_string()); + continue; + } + if let Some(text_obj) = obj.get("text").and_then(|t| t.as_object()) { + if let Some(val) = text_obj.get("value").and_then(|v| v.as_str()) { + parts.push(val.to_string()); + continue; + } + } + if let Some(content) = obj.get("content") { + let flattened = flatten_message_content(content); + if !flattened.is_empty() { + parts.push(flattened); + continue; + } + } + if let Some(text) = obj.get("message").and_then(|t| t.as_str()) { + parts.push(text.to_string()); + } + } + } + return parts.join(""); + } + if let Some(obj) = value.as_object() { + if let Some(text) = obj.get("text").and_then(|t| t.as_str()) { + return text.to_string(); + } + if let Some(content) = obj.get("content") { + return flatten_message_content(content); + } + } + value.to_string() +} + +pub(crate) fn build_cli_prompt(messages: &[ChatMessage]) -> String { + let mut lines: Vec<String> = Vec::new(); + for msg in messages { + let content = flatten_message_content(&msg.content); + if content.trim().is_empty() { + continue; + } + lines.push(format!( + "{}: {}", + msg.role.to_uppercase(), + content.trim() + )); + } + lines.join("\n\n") +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn flatten_message_content_handles_nested_arrays() { + let value = json!([ + { "text": "Hello" }, + { "content": [{ "text": " " }, { "text": "World" }] }, + { "content": { "text": "!" } } + ]); + assert_eq!(flatten_message_content(&value), "Hello World!"); + } + + #[test] + fn build_cli_prompt_formats_roles() { + let messages = vec![ + ChatMessage { + role: "user".to_string(), + content: json!("Hi"), + }, + ChatMessage { + role: "assistant".to_string(), + content: json!("Ok"), + }, + ]; + assert_eq!(build_cli_prompt(&messages), "USER: Hi\n\nASSISTANT: Ok"); + } +} diff --git a/src-tauri/src/commands/agent.rs b/src-tauri/src/commands/agent.rs new file mode 100644 index 0000000..7b0e389 --- /dev/null +++ b/src-tauri/src/commands/agent.rs @@ -0,0 +1,2133 @@ +use crate::agent_rpc::{AgentRpcKind, AgentRpcSession, AgentRpcState}; +use crate::chat::build_cli_prompt; +use crate::utils::{map_err, CmdResult}; +use crate::AppState; +use opencontext_core::search::SearchConfig; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::io::{BufRead, BufReader, ErrorKind, Write}; +use std::path::PathBuf; +use std::process::{Command, Stdio}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{mpsc, Arc, Mutex}; +use std::time::{Duration, Instant}; +use tauri::{Emitter, Manager, State}; + +static AGENT_COUNTER: AtomicU64 = AtomicU64::new(1); +const AGENT_SESSIONS_FILE: &str = "agent-sessions.json"; +const DEFAULT_CODEX_MODELS: [&str; 4] = [ + "gpt-5.2-codex", + "gpt-5.1-codex-max", + "gpt-5.1-codex-mini", + "gpt-5.2", +]; +const DEFAULT_AGENTS_MD: &str = r#"# OpenContext Agent + +You are the OpenContext dedicated coding agent. + +Guidelines: +- Prefer using `oc` CLI commands to create/search/iterate OpenContext content. +- Avoid editing user files directly unless explicitly requested. +- When reading or writing files, ask for permission if required. +- Be concise, actionable, and follow OpenContext workflows. +"#; + +#[derive(Serialize, Clone, Default)] +pub(crate) struct AgentStreamEvent { + #[serde(skip_serializing_if = "Option::is_none")] + content: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + done: Option<bool>, + #[serde(skip_serializing_if = "Option::is_none")] + error: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + status: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + reasoning: Option<String>, + #[serde(skip_serializing_if = "Option::is_none")] + permission: Option<serde_json::Value>, + #[serde(skip_serializing_if = "Option::is_none")] + tool: Option<serde_json::Value>, + #[serde(skip_serializing_if = "Option::is_none")] + models: Option<serde_json::Value>, +} + +fn agent_sessions_path(app: &tauri::AppHandle) -> CmdResult<PathBuf> { + let base_dir = app.path().app_data_dir().map_err(map_err)?; + Ok(base_dir.join(AGENT_SESSIONS_FILE)) +} + +fn emit_agent_event(app: &tauri::AppHandle, request_id: &str, payload: AgentStreamEvent) { + let event_name = format!("agent-stream-{}", request_id); + let _ = app.emit(&event_name, payload); +} + +fn emit_agent_error(app: &tauri::AppHandle, request_id: &str, message: String) { + emit_agent_event( + app, + request_id, + AgentStreamEvent { + content: None, + done: Some(true), + error: Some(message), + ..Default::default() + }, + ); +} + +fn emit_agent_status(app: &tauri::AppHandle, request_id: &str, status: &str) { + emit_agent_event( + app, + request_id, + AgentStreamEvent { + status: Some(status.to_string()), + ..Default::default() + }, + ); +} + +fn detect_codex_mcp_args() -> Vec<String> { + let output = Command::new("codex") + .arg("--version") + .output() + .ok() + .and_then(|out| String::from_utf8(out.stdout).ok()) + .unwrap_or_default(); + + parse_codex_mcp_args(&output) +} + +pub(crate) fn parse_codex_mcp_args(output: &str) -> Vec<String> { + let mut major = 0; + let mut minor = 0; + + for token in output.split_whitespace() { + let trimmed = token.trim_start_matches('v'); + let mut parts = trimmed.split('.').filter_map(|p| p.parse::<u32>().ok()); + if let (Some(mj), Some(mn)) = (parts.next(), parts.next()) { + major = mj; + minor = mn; + break; + } + } + + if major > 0 || minor >= 40 { + return vec!["mcp-server".to_string()]; + } + if major == 0 && minor == 0 { + return vec!["mcp-server".to_string()]; + } + vec!["mcp".to_string(), "serve".to_string()] +} + +fn strip_ansi(input: &str) -> String { + let mut out = String::new(); + let mut chars = input.chars().peekable(); + while let Some(ch) = chars.next() { + if ch == '\u{1b}' { + if matches!(chars.peek(), Some('[')) { + chars.next(); + while let Some(next) = chars.next() { + if next.is_ascii_alphabetic() { + break; + } + } + continue; + } + } + out.push(ch); + } + out +} + +fn extract_error_detail(message: &str) -> String { + let cleaned = strip_ansi(message); + let lower = cleaned.to_lowercase(); + if let Some(pos) = lower.find("error=") { + return cleaned[pos + 6..].trim().to_string(); + } + if let Some(pos) = lower.find("error:") { + return cleaned[pos + 6..].trim().to_string(); + } + cleaned.trim().to_string() +} + +fn classify_http_error(message: &str, label: &str) -> Option<String> { + let lower = message.to_lowercase(); + if lower.contains("error=http") + || lower.contains("http 4") + || lower.contains("http 5") + || lower.contains("too many requests") + || lower.contains("rate limit") + || lower.contains("usage_not_included") + || lower.contains("quota") + { + let detail = extract_error_detail(message); + return Some(format!("{} request failed: {}", label, detail)); + } + None +} + +fn classify_codex_error(message: &str) -> Option<String> { + let cleaned = strip_ansi(message); + let lower = cleaned.to_lowercase(); + if lower.contains("command not found") || lower.contains("not recognized") { + return Some( + "Codex CLI not found. Please ensure 'codex' is installed and in PATH.".to_string(), + ); + } + if lower.contains("permission denied") { + return Some(format!("Permission denied when starting Codex: {}", cleaned)); + } + if lower.contains("authentication") || lower.contains("login") { + return Some("Codex authentication required. Please run 'codex auth' first.".to_string()); + } + if lower.contains("unknown flag") + || lower.contains("invalid option") + || lower.contains("unrecognized") + { + return Some(format!("Invalid Codex CLI arguments: {}", cleaned)); + } + if lower.contains("timed out") || lower.contains("timeout") { + return Some("Codex initialization timed out. Please check Codex auth status and network.".to_string()); + } + if let Some(error) = classify_http_error(&cleaned, "Codex") { + return Some(error); + } + None +} + +fn classify_acp_error(message: &str, kind: AgentRpcKind) -> Option<String> { + let label = match kind { + AgentRpcKind::ClaudeAcp => "Claude", + AgentRpcKind::OpenCodeAcp => "OpenCode", + _ => "ACP", + }; + let cleaned = strip_ansi(message); + let lower = cleaned.to_lowercase(); + if lower.contains("command not found") || lower.contains("not recognized") { + return Some(format!( + "{} CLI not found. Please ensure the CLI is installed and in PATH.", + label + )); + } + if lower.contains("permission denied") { + return Some(format!("Permission denied when starting {}.", label)); + } + if lower.contains("authentication") || lower.contains("unauthorized") || lower.contains("login") { + let hint = match kind { + AgentRpcKind::ClaudeAcp => "Please run `claude /login`.", + AgentRpcKind::OpenCodeAcp => "Please run `opencode auth login`.", + _ => "", + }; + let suffix = if hint.is_empty() { "".to_string() } else { format!(" {}", hint) }; + return Some(format!("{} authentication required.{}", label, suffix)); + } + if lower.contains("timed out") || lower.contains("timeout") { + return Some(format!("{} request timed out. Please check network and auth.", label)); + } + if let Some(error) = classify_http_error(&cleaned, label) { + return Some(error); + } + None +} + +fn codex_preflight(app: &tauri::AppHandle, session: &AgentRpcSession, request_id: &str) -> CmdResult<()> { + emit_agent_status(app, request_id, "connecting"); + if let Some(err) = session + .state + .lock() + .ok() + .and_then(|state| state.startup_error.clone()) + { + emit_agent_status(app, request_id, "error"); + return Err(err); + } + + wait_for_codex_ready(session, 10, 250); + + let already_initialized = session + .state + .lock() + .map(|state| state.initialized) + .unwrap_or(false); + if already_initialized { + emit_agent_status(app, request_id, "session_active"); + return Ok(()); + } + + emit_agent_status(app, request_id, "authenticating"); + let client_name = app.package_info().name.clone(); + let client_version = app.package_info().version.to_string(); + let init_params = serde_json::json!({ + "protocolVersion": "1.0.0", + "capabilities": {}, + "clientInfo": { + "name": client_name, + "version": client_version, + } + }); + + let init_result = send_rpc_request(session, "initialize", init_params, None, true, 15); + let init_ok = init_result.is_ok(); + if !init_ok { + let tools_result = send_rpc_request(session, "tools/list", serde_json::json!({}), None, true, 10); + if let Err(err) = tools_result { + let message = classify_codex_error(&err).unwrap_or(err); + emit_agent_status(app, request_id, "error"); + return Err(message); + } + } + + if let Ok(mut state) = session.state.lock() { + state.initialized = true; + } + emit_agent_status(app, request_id, "authenticated"); + emit_agent_status(app, request_id, "session_active"); + Ok(()) +} + +fn run_cli_login(command: &str, args: &[&str]) -> CmdResult<()> { + let mut child = Command::new(command) + .args(args) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .map_err(map_err)?; + let start = Instant::now(); + let timeout = Duration::from_secs(70); + loop { + if let Some(status) = child.try_wait().map_err(map_err)? { + if status.success() { + return Ok(()); + } + return Err(format!("Login command failed with status: {}", status)); + } + if start.elapsed() > timeout { + let _ = child.kill(); + return Err("Login command timed out".to_string()); + } + std::thread::sleep(Duration::from_millis(200)); + } +} + +fn attempt_acp_login(kind: AgentRpcKind) -> CmdResult<()> { + match kind { + AgentRpcKind::ClaudeAcp => { + if run_cli_login("claude", &["/login"]).is_ok() { + return Ok(()); + } + run_cli_login("npx", &["@anthropic-ai/claude-code", "/login"])?; + } + AgentRpcKind::OpenCodeAcp => { + run_cli_login("opencode", &["auth", "login"])?; + } + _ => {} + } + Ok(()) +} + +fn probe_acp_auth(session: &AgentRpcSession, session_id: &str, kind: AgentRpcKind) -> CmdResult<()> { + let params = serde_json::json!({ + "sessionId": session_id, + "prompt": [{ "type": "text", "text": "ping" }] + }); + let result = send_rpc_request(session, "session/prompt", params, None, true, 8); + match result { + Ok(_) => Ok(()), + Err(err) => { + let lower = err.to_lowercase(); + if lower.contains("timed out") || lower.contains("timeout") { + return Ok(()); + } + Err(classify_acp_error(&err, kind).unwrap_or(err)) + } + } +} + +fn acp_preflight( + app: &tauri::AppHandle, + session: &AgentRpcSession, + request_id: &str, + kind: AgentRpcKind, + cwd: Option<String>, +) -> CmdResult<String> { + emit_agent_status(app, request_id, "connecting"); + if let Some(err) = session + .state + .lock() + .ok() + .and_then(|state| state.startup_error.clone()) + { + emit_agent_status(app, request_id, "error"); + return Err(err); + } + + let existing_session_id = session + .state + .lock() + .ok() + .and_then(|state| state.session_id.clone()); + if let Some(session_id) = existing_session_id { + if let Some(resolved) = resolve_agent_cwd(cwd) { + if let Ok(mut state) = session.state.lock() { + state.cwd = Some(resolved); + } + } + emit_agent_status(app, request_id, "session_active"); + return Ok(session_id); + } + + let init_params = serde_json::json!({ + "protocolVersion": 1, + "clientCapabilities": { + "fs": { + "readTextFile": true, + "writeTextFile": true, + } + } + }); + + let init_result = send_rpc_request(session, "initialize", init_params, None, true, 60); + let init_value = match init_result { + Ok(value) => value, + Err(err) => { + let message = classify_acp_error(&err, kind).unwrap_or(err); + emit_agent_status(app, request_id, "error"); + return Err(message); + } + }; + emit_agent_status(app, request_id, "connected"); + + let has_auth_methods = init_value + .as_ref() + .and_then(|val| val.get("authMethods")) + .and_then(|val| val.as_array()) + .map(|methods| !methods.is_empty()) + .unwrap_or(false); + + if has_auth_methods { + let auth_method_id = init_value + .as_ref() + .and_then(|val| val.get("authMethods")) + .and_then(|val| val.as_array()) + .and_then(|methods| { + methods.iter().find_map(|method| { + method + .get("methodId") + .or_else(|| method.get("id")) + .or_else(|| method.get("type")) + .and_then(|value| value.as_str()) + .map(|value| value.to_string()) + }) + }); + let auth_params = auth_method_id + .map(|method_id| serde_json::json!({ "methodId": method_id })) + .unwrap_or_else(|| serde_json::json!({})); + let auth_result = send_rpc_request(session, "authenticate", auth_params.clone(), None, true, 60); + if let Err(err) = auth_result { + let lower = err.to_lowercase(); + let can_ignore = lower.contains("method not found") + || lower.contains("unknown method") + || lower.contains("no such method") + || lower.contains("not implemented"); + if !can_ignore { + let _ = attempt_acp_login(kind); + let retry = send_rpc_request(session, "authenticate", auth_params, None, true, 60); + if let Err(err) = retry { + let message = classify_acp_error(&err, kind).unwrap_or(err); + emit_agent_status(app, request_id, "error"); + return Err(message); + } + } + } + } + + let cwd_value = resolve_agent_cwd(cwd).unwrap_or_else(|| ".".to_string()); + let session_params = serde_json::json!({ "cwd": cwd_value, "mcpServers": [] }); + let session_result = send_rpc_request(session, "session/new", session_params, None, true, 60); + let session_value = match session_result { + Ok(value) => value, + Err(err) => { + if has_auth_methods { + let _ = attempt_acp_login(kind); + let retry_params = serde_json::json!({ "cwd": cwd_value, "mcpServers": [] }); + let retry_result = + send_rpc_request(session, "session/new", retry_params, None, true, 60); + match retry_result { + Ok(value) => value, + Err(err) => { + let message = classify_acp_error(&err, kind).unwrap_or(err); + emit_agent_status(app, request_id, "error"); + return Err(message); + } + } + } else { + let message = classify_acp_error(&err, kind).unwrap_or(err); + emit_agent_status(app, request_id, "error"); + return Err(message); + } + } + }; + + if let Some(models) = session_value + .as_ref() + .and_then(|val| val.get("models")) + .cloned() + { + emit_agent_event( + app, + request_id, + AgentStreamEvent { + models: Some(models), + ..Default::default() + }, + ); + } + + let Some(session_id) = session_value + .as_ref() + .and_then(|val| val.get("sessionId").and_then(|v| v.as_str()).map(|s| s.to_string())) + else { + emit_agent_status(app, request_id, "error"); + return Err("ACP session did not return a sessionId".to_string()); + }; + + if let Ok(mut state) = session.state.lock() { + state.session_id = Some(session_id.clone()); + state.cwd = Some(cwd_value.clone()); + state.initialized = true; + } + + if matches!(kind, AgentRpcKind::ClaudeAcp | AgentRpcKind::OpenCodeAcp) { + if let Err(err) = probe_acp_auth(session, &session_id, kind) { + emit_agent_status(app, request_id, "error"); + if let Ok(mut state) = session.state.lock() { + state.session_id = None; + state.initialized = false; + } + return Err(err); + } + } + + emit_agent_status(app, request_id, "authenticated"); + emit_agent_status(app, request_id, "session_active"); + Ok(session_id) +} + +fn wait_for_codex_ready(session: &AgentRpcSession, attempts: u32, delay_ms: u64) { + for _ in 0..attempts { + if send_rpc_request( + session, + "ping", + serde_json::json!({}), + None, + true, + 3, + ) + .is_ok() + { + return; + } + std::thread::sleep(Duration::from_millis(delay_ms)); + } +} + +fn spawn_agent_rpc_session( + app: tauri::AppHandle, + kind: AgentRpcKind, + cwd: Option<String>, + model: Option<String>, +) -> CmdResult<Arc<AgentRpcSession>> { + let mut cmd = match kind { + AgentRpcKind::CodexMcp => { + let mut cmd = Command::new("codex"); + for arg in detect_codex_mcp_args() { + cmd.arg(arg); + } + if let Some(model) = model.as_ref() { + let trimmed = model.trim(); + if !trimmed.is_empty() { + cmd.arg("-c").arg(format!("model=\"{}\"", trimmed)); + } + } + cmd.env("CODEX_NO_INTERACTIVE", "1") + .env("CODEX_AUTO_CONTINUE", "1"); + cmd + } + AgentRpcKind::ClaudeAcp => { + let mut cmd = Command::new("npx"); + cmd.arg("@zed-industries/claude-code-acp"); + cmd + } + AgentRpcKind::OpenCodeAcp => { + let mut cmd = Command::new("opencode"); + cmd.arg("acp"); + cmd + } + }; + + if let Some(cwd) = cwd.as_ref() { + if !cwd.trim().is_empty() { + cmd.current_dir(cwd); + } + } + + cmd.stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()); + + let mut child = cmd.spawn().map_err(|err| { + match kind { + AgentRpcKind::CodexMcp => match err.kind() { + ErrorKind::NotFound => { + return "Codex CLI not found. Please ensure 'codex' is installed and in PATH." + .to_string(); + } + ErrorKind::PermissionDenied => { + return "Permission denied when starting Codex.".to_string(); + } + _ => {} + }, + AgentRpcKind::ClaudeAcp => match err.kind() { + ErrorKind::NotFound => { + return "npx not found. Please install Node.js/npm to run Claude ACP." + .to_string(); + } + ErrorKind::PermissionDenied => { + return "Permission denied when starting Claude ACP.".to_string(); + } + _ => {} + }, + AgentRpcKind::OpenCodeAcp => match err.kind() { + ErrorKind::NotFound => { + return "OpenCode CLI not found. Please ensure 'opencode' is installed and in PATH." + .to_string(); + } + ErrorKind::PermissionDenied => { + return "Permission denied when starting OpenCode ACP.".to_string(); + } + _ => {} + }, + } + map_err(err) + })?; + let stdin = child + .stdin + .take() + .ok_or_else(|| "Failed to capture stdin".to_string())?; + let stdout = child + .stdout + .take() + .ok_or_else(|| "Failed to capture stdout".to_string())?; + let stderr = child.stderr.take(); + + let session = Arc::new(AgentRpcSession { + kind, + child: Arc::new(Mutex::new(child)), + stdin: Arc::new(Mutex::new(stdin)), + state: Arc::new(Mutex::new(AgentRpcState { + pending_responses: HashMap::new(), + request_map: HashMap::new(), + active_request: None, + session_id: None, + model: model.clone(), + cwd: None, + conversation_id: None, + initialized: false, + codex_session_started: false, + codex_received_delta: false, + codex_elicitation_map: HashMap::new(), + codex_patch_changes: HashMap::new(), + acp_permission_map: HashMap::new(), + startup_error: None, + })), + next_id: AtomicU64::new(1), + }); + + let app_for_stdout = app.clone(); + let state_for_stdout = session.state.clone(); + let stdin_for_stdout = session.stdin.clone(); + let kind_for_stdout = session.kind; + + if let Some(stderr) = stderr { + let app_for_stderr = app.clone(); + let state_for_stderr = session.state.clone(); + std::thread::spawn(move || { + let reader = BufReader::new(stderr); + for line in reader.lines().flatten() { + match kind_for_stdout { + AgentRpcKind::CodexMcp => { + eprintln!("[codex mcp] {}", line); + if let Some(message) = classify_codex_error(&line) { + let active_request = state_for_stderr + .lock() + .ok() + .and_then(|state| state.active_request.clone()); + if let Some(request_id) = active_request { + emit_agent_error(&app_for_stderr, &request_id, message); + if let Ok(mut state) = state_for_stderr.lock() { + state.active_request = None; + } + } else if let Ok(mut state) = state_for_stderr.lock() { + state.startup_error = Some(message); + } + } + } + AgentRpcKind::ClaudeAcp => { + eprintln!("[claude acp] {}", line); + if let Some(message) = classify_acp_error(&line, AgentRpcKind::ClaudeAcp) { + let active_request = state_for_stderr + .lock() + .ok() + .and_then(|state| state.active_request.clone()); + if let Some(request_id) = active_request { + emit_agent_error(&app_for_stderr, &request_id, message); + if let Ok(mut state) = state_for_stderr.lock() { + state.active_request = None; + } + } else if let Ok(mut state) = state_for_stderr.lock() { + state.startup_error = Some(message); + } + } + } + AgentRpcKind::OpenCodeAcp => { + eprintln!("[opencode acp] {}", line); + if let Some(message) = classify_acp_error(&line, AgentRpcKind::OpenCodeAcp) { + let active_request = state_for_stderr + .lock() + .ok() + .and_then(|state| state.active_request.clone()); + if let Some(request_id) = active_request { + emit_agent_error(&app_for_stderr, &request_id, message); + if let Ok(mut state) = state_for_stderr.lock() { + state.active_request = None; + } + } else if let Ok(mut state) = state_for_stderr.lock() { + state.startup_error = Some(message); + } + } + } + } + } + }); + } + + std::thread::spawn(move || { + let reader = BufReader::new(stdout); + for line in reader.lines().flatten() { + let trimmed = line.trim(); + if trimmed.is_empty() { + continue; + } + + let parsed = serde_json::from_str::<serde_json::Value>(trimmed).ok(); + if parsed.is_none() { + if kind_for_stdout == AgentRpcKind::CodexMcp { + if trimmed.contains("Press Enter to continue") + || trimmed.contains("Launching Codex CLI") + { + if let Ok(mut stdin) = stdin_for_stdout.lock() { + let _ = stdin.write_all(b"\n"); + stdin.flush().ok(); + } + } + } + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + content: Some(trimmed.to_string()), + ..Default::default() + }, + ); + } + continue; + } + let value = parsed.unwrap(); + + let response_id = value.get("id").and_then(|v| v.as_u64()); + let is_response = response_id.is_some() + && (value.get("result").is_some() || value.get("error").is_some()); + if let Some(id) = response_id { + if is_response { + if let Some(tx) = state_for_stdout + .lock() + .ok() + .and_then(|mut state| state.pending_responses.remove(&id)) + { + let result = if value.get("error").is_some() { + Err(value["error"].to_string()) + } else { + Ok(value.get("result").cloned().unwrap_or(serde_json::Value::Null)) + }; + let _ = tx.send(result); + } + + let request_id = state_for_stdout + .lock() + .ok() + .and_then(|mut state| state.request_map.remove(&id)); + if let Some(request_id) = request_id { + // 对于所有 Agent 类型,如果收到错误响应,都需要发送错误事件 + let has_error = value.get("error").is_some(); + if has_error { + let error_msg = value.get("error") + .map(|e| { + // 尝试提取更有意义的错误信息 + if let Some(msg) = e.get("message").and_then(|m| m.as_str()) { + msg.to_string() + } else { + e.to_string() + } + }) + .unwrap_or_else(|| "Unknown error".to_string()); + emit_agent_error(&app_for_stdout, &request_id, error_msg); + if let Ok(mut state) = state_for_stdout.lock() { + state.active_request = None; + } + } else if kind_for_stdout != AgentRpcKind::CodexMcp { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + done: Some(true), + ..Default::default() + }, + ); + if let Ok(mut state) = state_for_stdout.lock() { + state.active_request = None; + } + } + } + continue; + } + } + + if let Some(method) = value.get("method").and_then(|v| v.as_str()) { + match (kind_for_stdout, method) { + (AgentRpcKind::ClaudeAcp | AgentRpcKind::OpenCodeAcp, "session/request_permission") => { + let request_id = value.get("id").and_then(|v| v.as_u64()); + let params = value.get("params"); + let call_id = params + .and_then(|p| p.get("toolCall")) + .and_then(|t| { + t.get("toolCallId") + .or_else(|| t.get("tool_call_id")) + .or_else(|| t.get("call_id")) + .or_else(|| t.get("id")) + }) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()); + if let (Some(request_id), Some(call_id)) = (request_id, call_id.clone()) { + if let Ok(mut state) = state_for_stdout.lock() { + state.acp_permission_map.insert(call_id.clone(), request_id); + } + } + if let (Some(call_id), Some(active_request)) = ( + call_id, + state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()), + ) { + emit_agent_event( + &app_for_stdout, + &active_request, + AgentStreamEvent { + permission: Some(serde_json::json!({ + "source": "acp", + "callId": call_id, + "toolCall": params.and_then(|p| p.get("toolCall")).cloned(), + "options": params.and_then(|p| p.get("options")).cloned(), + })), + ..Default::default() + }, + ); + } + } + (AgentRpcKind::ClaudeAcp | AgentRpcKind::OpenCodeAcp, "fs/read_text_file") => { + if let Some(request_id) = response_id { + let cwd = state_for_stdout + .lock() + .ok() + .and_then(|state| state.cwd.clone()); + let result = handle_fs_read(value.get("params"), cwd); + let _ = send_rpc_response(&stdin_for_stdout, request_id, result); + } + } + (AgentRpcKind::ClaudeAcp | AgentRpcKind::OpenCodeAcp, "fs/write_text_file") => { + if let Some(request_id) = response_id { + let cwd = state_for_stdout + .lock() + .ok() + .and_then(|state| state.cwd.clone()); + let result = handle_fs_write(value.get("params"), cwd); + let _ = send_rpc_response(&stdin_for_stdout, request_id, result); + } + } + (AgentRpcKind::CodexMcp, "codex/event") => { + if let Some(msg) = value.get("params").and_then(|p| p.get("msg")) { + if let Some(msg_type) = msg.get("type").and_then(|t| t.as_str()) { + if msg_type == "agent_message_delta" { + if let Some(delta) = msg.get("delta").and_then(|d| d.as_str()) { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|mut state| { + state.codex_received_delta = true; + state.active_request.clone() + }) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + content: Some(delta.to_string()), + ..Default::default() + }, + ); + } + } + } + + if msg_type == "agent_reasoning_delta" { + if let Some(delta) = msg.get("delta").and_then(|d| d.as_str()) { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + reasoning: Some(delta.to_string()), + ..Default::default() + }, + ); + } + } + } + + if msg_type == "task_started" { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + status: Some("task_started".to_string()), + ..Default::default() + }, + ); + } + } + + if msg_type == "exec_approval_request" + || msg_type == "apply_patch_approval_request" + { + let call_id = msg + .get("call_id") + .and_then(|v| v.as_str()) + .or_else(|| msg.get("codex_call_id").and_then(|v| v.as_str())) + .map(|s| s.to_string()); + + if let Some(call_id) = call_id.clone() { + if let Some(req_id) = response_id { + if let Ok(mut state) = state_for_stdout.lock() { + state.codex_elicitation_map.insert(call_id.clone(), req_id); + } + } + + if msg_type == "apply_patch_approval_request" { + if let Some(changes) = msg + .get("changes") + .or_else(|| msg.get("codex_changes")) + .cloned() + { + if let Ok(mut state) = state_for_stdout.lock() { + state.codex_patch_changes.insert(call_id.clone(), changes); + } + } + } + + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + permission: Some(serde_json::json!({ + "type": msg_type, + "callId": call_id, + "data": msg, + })), + ..Default::default() + }, + ); + } + } + } + + if msg_type == "exec_command_begin" + || msg_type == "exec_command_output_delta" + || msg_type == "exec_command_end" + || msg_type == "patch_apply_begin" + || msg_type == "patch_apply_end" + || msg_type == "mcp_tool_call_begin" + || msg_type == "mcp_tool_call_end" + { + if let Some(call_id) = msg + .get("call_id") + .and_then(|v| v.as_str()) + .or_else(|| msg.get("codex_call_id").and_then(|v| v.as_str())) + { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + tool: Some(serde_json::json!({ + "type": msg_type, + "callId": call_id, + "data": msg, + })), + ..Default::default() + }, + ); + } + } + } + + if msg_type == "agent_message" { + if let Some(message) = msg.get("message").and_then(|m| m.as_str()) { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| { + if state.codex_received_delta { + None + } else { + state.active_request.clone() + } + }) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + content: Some(message.to_string()), + ..Default::default() + }, + ); + } + } + } + + if msg_type == "task_complete" { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|mut state| { + state.codex_received_delta = false; + state.active_request.clone() + }) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + done: Some(true), + ..Default::default() + }, + ); + if let Ok(mut state) = state_for_stdout.lock() { + state.active_request = None; + } + } + } + + if msg_type == "session_configured" { + if let Some(session_id) = msg.get("session_id").and_then(|s| s.as_str()) { + if let Ok(mut state) = state_for_stdout.lock() { + state.conversation_id = Some(session_id.to_string()); + state.codex_session_started = true; + } + } + } + } + } + } + (AgentRpcKind::ClaudeAcp, "session/update") + | (AgentRpcKind::OpenCodeAcp, "session/update") => { + if let Some(update) = value.get("params") { + if let Some(session_update) = update + .get("update") + .and_then(|u| u.get("sessionUpdate")) + .and_then(|u| u.as_str()) + { + if session_update == "agent_message_chunk" { + if let Some(text) = update + .get("update") + .and_then(|u| u.get("content")) + .and_then(|c| c.get("text")) + .and_then(|t| t.as_str()) + { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + content: Some(text.to_string()), + ..Default::default() + }, + ); + } + } + } else if session_update == "agent_thought_chunk" { + if let Some(text) = update + .get("update") + .and_then(|u| u.get("content")) + .and_then(|c| c.get("text")) + .and_then(|t| t.as_str()) + { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + reasoning: Some(text.to_string()), + ..Default::default() + }, + ); + } + } + } else if session_update == "tool_call" || session_update == "tool_call_update" { + if let Some(call_id) = update + .get("update") + .and_then(|u| { + u.get("toolCallId") + .or_else(|| u.get("tool_call_id")) + .or_else(|| u.get("call_id")) + .or_else(|| u.get("id")) + }) + .and_then(|v| v.as_str()) + { + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + tool: Some(serde_json::json!({ + "type": session_update, + "callId": call_id, + "data": update, + })), + ..Default::default() + }, + ); + } + } + } + } + } + } + _ => {} + } + } + } + + if let Some(request_id) = state_for_stdout + .lock() + .ok() + .and_then(|state| state.active_request.clone()) + { + emit_agent_event( + &app_for_stdout, + &request_id, + AgentStreamEvent { + done: Some(true), + ..Default::default() + }, + ); + } + }); + + Ok(session) +} + +fn send_rpc_request( + session: &AgentRpcSession, + method: &str, + params: serde_json::Value, + request_id: Option<String>, + wait_response: bool, + timeout_secs: u64, +) -> CmdResult<Option<serde_json::Value>> { + let id = session.next_id.fetch_add(1, Ordering::Relaxed); + let payload = serde_json::json!({ + "jsonrpc": "2.0", + "id": id, + "method": method, + "params": params, + }); + let line = format!("{}\n", payload.to_string()); + + let mut rx = None; + if wait_response { + let (tx, receiver) = mpsc::channel(); + if let Ok(mut state) = session.state.lock() { + state.pending_responses.insert(id, tx); + } + rx = Some(receiver); + } + + if let Some(request_id) = request_id { + if let Ok(mut state) = session.state.lock() { + state.request_map.insert(id, request_id.clone()); + state.active_request = Some(request_id); + state.codex_received_delta = false; + } + } + + { + let mut stdin = session.stdin.lock().map_err(map_err)?; + stdin.write_all(line.as_bytes()).map_err(map_err)?; + stdin.flush().ok(); + } + + if let Some(receiver) = rx { + let result = receiver + .recv_timeout(Duration::from_secs(timeout_secs)) + .map_err(|_| "RPC request timed out".to_string())?; + return result.map(Some).map_err(|e| e); + } + + Ok(None) +} + +fn send_rpc_response( + stdin: &Arc<Mutex<std::process::ChildStdin>>, + id: u64, + result: Result<serde_json::Value, String>, +) -> CmdResult<()> { + let payload = match result { + Ok(value) => serde_json::json!({ + "jsonrpc": "2.0", + "id": id, + "result": value, + }), + Err(message) => serde_json::json!({ + "jsonrpc": "2.0", + "id": id, + "error": { + "code": -32603, + "message": message, + } + }), + }; + let line = format!("{}\n", payload); + let mut stdin = stdin.lock().map_err(map_err)?; + stdin.write_all(line.as_bytes()).map_err(map_err)?; + stdin.flush().map_err(map_err)?; + Ok(()) +} + +fn handle_fs_read( + params: Option<&serde_json::Value>, + cwd: Option<String>, +) -> Result<serde_json::Value, String> { + let params = params.ok_or_else(|| "Missing params".to_string())?; + let path = params + .get("path") + .and_then(|v| v.as_str()) + .ok_or_else(|| "Missing path".to_string())?; + let line = params.get("line").and_then(|v| v.as_u64()).unwrap_or(1) as usize; + let limit = params.get("limit").and_then(|v| v.as_u64()).map(|v| v as usize); + let resolved = resolve_fs_path(cwd, path); + let content = std::fs::read_to_string(&resolved).map_err(map_err)?; + if line <= 1 && limit.is_none() { + return Ok(serde_json::json!({ "content": content })); + } + let lines: Vec<&str> = content.lines().collect(); + let start = line.saturating_sub(1); + let end = limit.map(|l| start.saturating_add(l)).unwrap_or(lines.len()); + let slice = if start >= lines.len() { + String::new() + } else { + lines[start..std::cmp::min(end, lines.len())].join("\n") + }; + Ok(serde_json::json!({ "content": slice })) +} + +fn handle_fs_write( + params: Option<&serde_json::Value>, + cwd: Option<String>, +) -> Result<serde_json::Value, String> { + let params = params.ok_or_else(|| "Missing params".to_string())?; + let path = params + .get("path") + .and_then(|v| v.as_str()) + .ok_or_else(|| "Missing path".to_string())?; + let content = params + .get("content") + .and_then(|v| v.as_str()) + .ok_or_else(|| "Missing content".to_string())?; + let resolved = resolve_fs_path(cwd, path); + if let Some(parent) = resolved.parent() { + std::fs::create_dir_all(parent).map_err(map_err)?; + } + std::fs::write(&resolved, content).map_err(map_err)?; + Ok(serde_json::json!({})) +} + +fn resolve_fs_path(cwd: Option<String>, path: &str) -> PathBuf { + let input = PathBuf::from(path); + if input.is_absolute() { + return input; + } + if let Some(cwd) = cwd { + return PathBuf::from(cwd).join(input); + } + std::env::current_dir() + .unwrap_or_else(|_| PathBuf::from(".")) + .join(input) +} + +fn default_agent_cwd() -> Option<String> { + let home = std::env::var("HOME").ok()?; + let path = PathBuf::from(home).join(".opencontext"); + if std::fs::create_dir_all(&path).is_err() { + return None; + } + let agents_path = path.join("AGENTS.md"); + if !agents_path.exists() { + let _ = std::fs::write(&agents_path, DEFAULT_AGENTS_MD); + } + Some(path.to_string_lossy().to_string()) +} + +fn resolve_agent_cwd(cwd: Option<String>) -> Option<String> { + let trimmed = cwd.as_deref().map(str::trim).unwrap_or(""); + if !trimmed.is_empty() { + return Some(trimmed.to_string()); + } + default_agent_cwd() +} + +fn try_set_acp_model( + session: &AgentRpcSession, + session_id: &str, + model: &str, +) -> CmdResult<()> { + let params = serde_json::json!({ + "sessionId": session_id, + "modelId": model, + }); + if let Err(err) = send_rpc_request(session, "session/set_model", params, None, true, 30) { + let lower = err.to_lowercase(); + let can_ignore = lower.contains("method not found") + || lower.contains("unknown method") + || lower.contains("no such method") + || lower.contains("not implemented"); + if !can_ignore { + return Err(err); + } + } + Ok(()) +} + +fn respond_elicitation(session: &AgentRpcSession, call_id: &str, decision: &str) -> CmdResult<()> { + let normalized = call_id + .trim_start_matches("patch_") + .trim_start_matches("elicitation_") + .to_string(); + let req_id = { + let mut state = session.state.lock().map_err(map_err)?; + state + .codex_elicitation_map + .remove(call_id) + .or_else(|| state.codex_elicitation_map.remove(&normalized)) + }; + + let Some(req_id) = req_id else { + return Ok(()); + }; + + let payload = serde_json::json!({ + "jsonrpc": "2.0", + "id": req_id, + "result": { + "decision": decision, + } + }); + let line = format!("{}\n", payload.to_string()); + + let mut stdin = session.stdin.lock().map_err(map_err)?; + stdin.write_all(line.as_bytes()).map_err(map_err)?; + stdin.flush().ok(); + Ok(()) +} + +fn parse_model_list(value: Option<&serde_json::Value>) -> Vec<String> { + match value { + Some(serde_json::Value::Array(items)) => items + .iter() + .filter_map(|item| item.as_str()) + .map(|item| item.trim().to_string()) + .filter(|item| !item.is_empty()) + .collect(), + Some(serde_json::Value::String(text)) => text + .lines() + .flat_map(|line| line.split(',')) + .map(|item| item.trim().to_string()) + .filter(|item| !item.is_empty()) + .collect(), + _ => Vec::new(), + } +} + +fn set_model_list_key( + config: &mut HashMap<String, serde_json::Value>, + key: &str, + models: Option<Vec<String>>, +) { + let models = models.unwrap_or_default(); + let cleaned: Vec<String> = models + .into_iter() + .map(|item| item.trim().to_string()) + .filter(|item| !item.is_empty()) + .collect(); + if cleaned.is_empty() { + config.remove(key); + } else { + config.insert( + key.to_string(), + serde_json::Value::Array(cleaned.into_iter().map(serde_json::Value::String).collect()), + ); + } +} + +fn get_or_create_rpc_session( + app: tauri::AppHandle, + state: State<AppState>, + session_id: &str, + kind: AgentRpcKind, + cwd: Option<String>, + model: Option<String>, +) -> CmdResult<Arc<AgentRpcSession>> { + let existing = { + let sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.get(session_id).cloned() + }; + + if let Some(session) = existing { + let desired = model + .as_ref() + .map(|m| m.trim().to_string()) + .filter(|m| !m.is_empty()); + if matches!(kind, AgentRpcKind::CodexMcp) { + let current = session + .state + .lock() + .ok() + .and_then(|state| state.model.clone()); + if let Some(desired_model) = desired { + if current.as_deref() != Some(desired_model.as_str()) { + if let Ok(mut child) = session.child.lock() { + let _ = child.kill(); + let _ = child.wait(); + } + let mut sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.remove(session_id); + } else { + return Ok(session); + } + } else { + return Ok(session); + } + } else { + return Ok(session); + } + } + + let session = spawn_agent_rpc_session(app, kind, cwd, model)?; + let mut sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.insert(session_id.to_string(), session.clone()); + Ok(session) +} + +fn stop_rpc_stream(app: tauri::AppHandle, state: State<AppState>, session_id: &str) -> CmdResult<()> { + let session = { + let sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.get(session_id).cloned() + }; + + if let Some(session) = session { + if let Ok(mut state) = session.state.lock() { + if let Some(request_id) = state.active_request.take() { + state.request_map.retain(|_, v| v != &request_id); + state.codex_received_delta = false; + state.acp_permission_map.clear(); + emit_agent_event( + &app, + &request_id, + AgentStreamEvent { + done: Some(true), + status: Some("stopped".to_string()), + ..Default::default() + }, + ); + } + } + } + + Ok(()) +} + +#[derive(Deserialize)] +pub(crate) struct CodexExecOptions { + messages: Vec<crate::chat::ChatMessage>, + #[serde(rename = "requestId")] + request_id: Option<String>, + #[serde(rename = "sessionId")] + session_id: String, + model: Option<String>, + cwd: Option<String>, +} + +#[tauri::command] +pub(crate) fn codex_exec( + app: tauri::AppHandle, + state: State<AppState>, + options: CodexExecOptions, +) -> CmdResult<serde_json::Value> { + let request_id = options.request_id.unwrap_or_else(|| { + format!( + "agent-{}", + AGENT_COUNTER.fetch_add(1, Ordering::Relaxed) + ) + }); + + let session_id = options.session_id.clone(); + let cwd = resolve_agent_cwd(options.cwd.clone()); + let model = options.model.clone(); + + let session = get_or_create_rpc_session( + app.clone(), + state, + &session_id, + AgentRpcKind::CodexMcp, + cwd.clone(), + model, + )?; + + let app_clone = app.clone(); + let request_id_clone = request_id.clone(); + + std::thread::spawn(move || { + if let Err(err) = codex_preflight(&app_clone, &session, &request_id_clone) { + emit_agent_error(&app_clone, &request_id_clone, err); + return; + } + let prompt = build_cli_prompt(&options.messages); + let (conversation_id, use_reply) = { + let mut state = session.state.lock().unwrap_or_else(|err| err.into_inner()); + let conversation_id = state + .conversation_id + .clone() + .unwrap_or_else(|| { + let id = session_id.clone(); + state.conversation_id = Some(id.clone()); + id + }); + let use_reply = state.codex_session_started; + if !state.codex_session_started { + state.codex_session_started = true; + } + (conversation_id, use_reply) + }; + + let mut args = serde_json::Map::new(); + args.insert("prompt".to_string(), serde_json::Value::String(prompt)); + if let Some(cwd) = cwd.clone() { + if !cwd.trim().is_empty() { + args.insert("cwd".to_string(), serde_json::Value::String(cwd)); + } + } + + let params = if use_reply { + args.insert( + "conversationId".to_string(), + serde_json::Value::String(conversation_id.clone()), + ); + serde_json::json!({ + "name": "codex-reply", + "arguments": serde_json::Value::Object(args), + }) + } else { + serde_json::json!({ + "name": "codex", + "arguments": serde_json::Value::Object(args), + "config": { + "conversationId": conversation_id, + } + }) + }; + + if let Err(err) = send_rpc_request( + &session, + "tools/call", + params, + Some(request_id_clone.clone()), + false, + 600, + ) { + emit_agent_error(&app_clone, &request_id_clone, err); + } + }); + + Ok(serde_json::json!({ "requestId": request_id })) +} + +#[derive(Deserialize)] +pub(crate) struct CodexKillOptions { + #[serde(rename = "sessionId")] + session_id: String, +} + +#[tauri::command] +pub(crate) fn codex_kill( + app: tauri::AppHandle, + state: State<AppState>, + options: CodexKillOptions, +) -> CmdResult<()> { + stop_rpc_stream(app, state, &options.session_id) +} + +#[derive(Deserialize)] +pub(crate) struct ClaudeExecOptions { + messages: Vec<crate::chat::ChatMessage>, + #[serde(rename = "requestId")] + request_id: Option<String>, + #[serde(rename = "sessionId")] + session_id: String, + model: Option<String>, + cwd: Option<String>, +} + +#[tauri::command] +pub(crate) fn claude_exec( + app: tauri::AppHandle, + state: State<AppState>, + options: ClaudeExecOptions, +) -> CmdResult<serde_json::Value> { + let request_id = options.request_id.unwrap_or_else(|| { + format!( + "agent-{}", + AGENT_COUNTER.fetch_add(1, Ordering::Relaxed) + ) + }); + + let session_id = options.session_id.clone(); + let cwd = resolve_agent_cwd(options.cwd.clone()); + let model = options.model.clone(); + + let session = get_or_create_rpc_session( + app.clone(), + state, + &session_id, + AgentRpcKind::ClaudeAcp, + cwd.clone(), + None, + )?; + + let app_clone = app.clone(); + let request_id_clone = request_id.clone(); + + std::thread::spawn(move || { + let session_id = match acp_preflight(&app_clone, &session, &request_id_clone, AgentRpcKind::ClaudeAcp, cwd.clone()) { + Ok(id) => id, + Err(err) => { + emit_agent_error(&app_clone, &request_id_clone, err); + return; + } + }; + + if let Some(model) = model { + let trimmed = model.trim().to_string(); + if !trimmed.is_empty() { + let _ = try_set_acp_model(&session, &session_id, &trimmed); + } + } + + let prompt = build_cli_prompt(&options.messages); + let params = serde_json::json!({ + "sessionId": session_id, + "prompt": [ + { "type": "text", "text": prompt } + ] + }); + + if let Err(err) = send_rpc_request( + &session, + "session/prompt", + params, + Some(request_id_clone.clone()), + false, + 300, + ) { + emit_agent_error(&app_clone, &request_id_clone, err); + } + }); + + Ok(serde_json::json!({ "requestId": request_id })) +} + +#[derive(Deserialize)] +pub(crate) struct ClaudeKillOptions { + #[serde(rename = "sessionId")] + session_id: String, +} + +#[tauri::command] +pub(crate) fn claude_kill( + app: tauri::AppHandle, + state: State<AppState>, + options: ClaudeKillOptions, +) -> CmdResult<()> { + stop_rpc_stream(app, state, &options.session_id) +} + +#[derive(Deserialize)] +pub(crate) struct OpenCodeRunOptions { + messages: Vec<crate::chat::ChatMessage>, + #[serde(rename = "requestId")] + request_id: Option<String>, + #[serde(rename = "sessionId")] + session_id: String, + model: Option<String>, + cwd: Option<String>, +} + +#[tauri::command] +pub(crate) fn opencode_run( + app: tauri::AppHandle, + state: State<AppState>, + options: OpenCodeRunOptions, +) -> CmdResult<serde_json::Value> { + let request_id = options.request_id.unwrap_or_else(|| { + format!( + "agent-{}", + AGENT_COUNTER.fetch_add(1, Ordering::Relaxed) + ) + }); + + let session_id = options.session_id.clone(); + let cwd = resolve_agent_cwd(options.cwd.clone()); + let model = options.model.clone(); + + let session = get_or_create_rpc_session( + app.clone(), + state, + &session_id, + AgentRpcKind::OpenCodeAcp, + cwd.clone(), + None, + )?; + + let app_clone = app.clone(); + let request_id_clone = request_id.clone(); + + std::thread::spawn(move || { + let session_id = match acp_preflight(&app_clone, &session, &request_id_clone, AgentRpcKind::OpenCodeAcp, cwd.clone()) { + Ok(id) => id, + Err(err) => { + emit_agent_error(&app_clone, &request_id_clone, err); + return; + } + }; + + if let Some(model) = model { + let trimmed = model.trim().to_string(); + if !trimmed.is_empty() { + let _ = try_set_acp_model(&session, &session_id, &trimmed); + } + } + + let prompt = build_cli_prompt(&options.messages); + let params = serde_json::json!({ + "sessionId": session_id, + "prompt": [ + { "type": "text", "text": prompt } + ] + }); + + if let Err(err) = send_rpc_request( + &session, + "session/prompt", + params, + Some(request_id_clone.clone()), + false, + 300, + ) { + emit_agent_error(&app_clone, &request_id_clone, err); + } + }); + + Ok(serde_json::json!({ "requestId": request_id })) +} + +#[derive(Deserialize)] +pub(crate) struct OpenCodeKillOptions { + #[serde(rename = "sessionId")] + session_id: String, +} + +#[tauri::command] +pub(crate) fn opencode_kill( + app: tauri::AppHandle, + state: State<AppState>, + options: OpenCodeKillOptions, +) -> CmdResult<()> { + stop_rpc_stream(app, state, &options.session_id) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AgentPreflightOptions { + session_id: String, + agent_id: String, + model: Option<String>, + cwd: Option<String>, +} + +#[tauri::command] +pub(crate) fn agent_preflight( + app: tauri::AppHandle, + state: State<AppState>, + options: AgentPreflightOptions, +) -> CmdResult<bool> { + let kind = match options.agent_id.as_str() { + "codex" => AgentRpcKind::CodexMcp, + "claude" => AgentRpcKind::ClaudeAcp, + "opencode" => AgentRpcKind::OpenCodeAcp, + other => return Err(format!("Unsupported agent: {}", other)), + }; + + let resolved_cwd = resolve_agent_cwd(options.cwd.clone()); + let session = get_or_create_rpc_session( + app.clone(), + state, + &options.session_id, + kind, + resolved_cwd.clone(), + options.model.clone(), + )?; + let request_id = format!("preflight-{}", options.session_id); + let cwd = resolved_cwd.clone(); + let app_clone = app.clone(); + + std::thread::spawn(move || { + let result = match kind { + AgentRpcKind::CodexMcp => codex_preflight(&app_clone, &session, &request_id).map(|_| None), + AgentRpcKind::ClaudeAcp | AgentRpcKind::OpenCodeAcp => { + acp_preflight(&app_clone, &session, &request_id, kind, cwd).map(Some) + } + }; + + match result { + Ok(session_id) => { + if let Some(model) = options.model.clone() { + let trimmed = model.trim().to_string(); + if !trimmed.is_empty() { + if let Some(session_id) = session_id.as_ref() { + let _ = try_set_acp_model(&session, session_id, &trimmed); + } + } + } + emit_agent_event( + &app_clone, + &request_id, + AgentStreamEvent { + done: Some(true), + ..Default::default() + }, + ); + } + Err(err) => { + emit_agent_error(&app_clone, &request_id, err); + } + } + }); + + Ok(true) +} + +#[tauri::command] +pub(crate) fn agent_models_get() -> CmdResult<serde_json::Value> { + let config_path = SearchConfig::json_config_path(); + if !config_path.exists() { + return Ok(serde_json::json!({ + "codex": DEFAULT_CODEX_MODELS, + "claude": [] + })); + } + let content = std::fs::read_to_string(&config_path).map_err(map_err)?; + let config: serde_json::Value = serde_json::from_str(&content).map_err(map_err)?; + let codex = { + let parsed = parse_model_list(config.get("AGENT_MODELS_CODEX")); + if parsed.is_empty() { + DEFAULT_CODEX_MODELS.iter().map(|item| item.to_string()).collect() + } else { + parsed + } + }; + let claude = parse_model_list(config.get("AGENT_MODELS_CLAUDE")); + Ok(serde_json::json!({ "codex": codex, "claude": claude })) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct AgentModelsSaveOptions { + codex: Option<Vec<String>>, + claude: Option<Vec<String>>, +} + +#[tauri::command] +pub(crate) fn agent_models_save( + options: AgentModelsSaveOptions, +) -> CmdResult<serde_json::Value> { + let config_path = SearchConfig::json_config_path(); + let mut config: HashMap<String, serde_json::Value> = if config_path.exists() { + let content = std::fs::read_to_string(&config_path).map_err(map_err)?; + serde_json::from_str(&content).map_err(map_err)? + } else { + HashMap::new() + }; + + set_model_list_key(&mut config, "AGENT_MODELS_CODEX", options.codex); + set_model_list_key(&mut config, "AGENT_MODELS_CLAUDE", options.claude); + + if let Some(parent) = config_path.parent() { + std::fs::create_dir_all(parent).map_err(map_err)?; + } + let content = serde_json::to_string_pretty(&config).map_err(map_err)?; + std::fs::write(&config_path, content).map_err(map_err)?; + Ok(serde_json::json!({ "config_path": config_path.to_string_lossy() })) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct OcExecOptions { + args: Vec<String>, + cwd: Option<String>, +} + +#[tauri::command] +pub(crate) fn oc_exec(options: OcExecOptions) -> CmdResult<serde_json::Value> { + if options.args.is_empty() { + return Err("Missing oc command arguments".to_string()); + } + let mut cmd = Command::new("oc"); + cmd.args(&options.args); + if let Some(cwd) = resolve_agent_cwd(options.cwd) { + cmd.current_dir(cwd); + } + let output = cmd.output().map_err(map_err)?; + let stdout = String::from_utf8_lossy(&output.stdout).to_string(); + let stderr = String::from_utf8_lossy(&output.stderr).to_string(); + let code = output.status.code().unwrap_or(-1); + Ok(serde_json::json!({ + "stdout": stdout, + "stderr": stderr, + "code": code + })) +} + +#[derive(Deserialize)] +pub(crate) struct CodexPermissionResponseOptions { + #[serde(rename = "sessionId")] + session_id: String, + #[serde(rename = "callId")] + call_id: String, + #[serde(rename = "type")] + permission_type: String, + approved: bool, +} + +#[tauri::command] +pub(crate) fn codex_permission_response( + state: State<AppState>, + options: CodexPermissionResponseOptions, +) -> CmdResult<()> { + let session = { + let sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.get(&options.session_id).cloned() + }; + + let Some(session) = session else { + return Err("Codex session not found".to_string()); + }; + + if options.permission_type == "apply_patch_approval_request" { + let normalized = options + .call_id + .trim_start_matches("patch_") + .trim_start_matches("elicitation_") + .to_string(); + let changes = { + let mut state = session.state.lock().map_err(map_err)?; + state + .codex_patch_changes + .remove(&options.call_id) + .or_else(|| state.codex_patch_changes.remove(&normalized)) + .unwrap_or_else(|| serde_json::json!({})) + }; + + let params = serde_json::json!({ + "call_id": options.call_id, + "approved": options.approved, + "changes": changes, + }); + let _ = send_rpc_request(&session, "apply_patch_approval_response", params, None, false, 30)?; + let _ = session.state.lock().map(|mut state| { + state.codex_elicitation_map.remove(&options.call_id); + state.codex_elicitation_map.remove(&normalized); + }); + } else { + let decision = if options.approved { "approved" } else { "denied" }; + respond_elicitation(&session, &options.call_id, decision)?; + } + + Ok(()) +} + +#[derive(Deserialize)] +pub(crate) struct AcpPermissionResponseOptions { + #[serde(rename = "sessionId")] + session_id: String, + #[serde(rename = "callId")] + call_id: String, + #[serde(rename = "optionId")] + option_id: Option<String>, +} + +#[tauri::command] +pub(crate) fn acp_permission_response( + state: State<AppState>, + options: AcpPermissionResponseOptions, +) -> CmdResult<()> { + let session = { + let sessions = state.agent_rpc_sessions.lock().map_err(map_err)?; + sessions.get(&options.session_id).cloned() + }; + + let Some(session) = session else { + return Err("ACP session not found".to_string()); + }; + + let request_id = { + let mut state = session.state.lock().map_err(map_err)?; + state.acp_permission_map.remove(&options.call_id) + }; + + let Some(request_id) = request_id else { + return Err("ACP permission request not found".to_string()); + }; + + let result = if let Some(option_id) = options.option_id { + serde_json::json!({ + "outcome": { + "outcome": "selected", + "optionId": option_id, + } + }) + } else { + serde_json::json!({ + "outcome": { + "outcome": "cancelled" + } + }) + }; + + send_rpc_response(&session.stdin, request_id, Ok(result))?; + Ok(()) +} + +#[tauri::command] +pub(crate) fn agent_sessions_load(app: tauri::AppHandle) -> CmdResult<Option<serde_json::Value>> { + let path = agent_sessions_path(&app)?; + if !path.exists() { + return Ok(None); + } + let content = std::fs::read_to_string(&path).map_err(map_err)?; + let payload = serde_json::from_str(&content).map_err(map_err)?; + Ok(Some(payload)) +} + +#[tauri::command] +pub(crate) fn agent_sessions_save( + app: tauri::AppHandle, + payload: serde_json::Value, +) -> CmdResult<bool> { + let path = agent_sessions_path(&app)?; + if let Some(parent) = path.parent() { + std::fs::create_dir_all(parent).map_err(map_err)?; + } + let content = serde_json::to_string(&payload).map_err(map_err)?; + std::fs::write(&path, content).map_err(map_err)?; + Ok(true) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parse_codex_mcp_args_prefers_mcp_server_for_new_versions() { + let args = parse_codex_mcp_args("codex v0.40.1"); + assert_eq!(args, vec!["mcp-server".to_string()]); + } + + #[test] + fn parse_codex_mcp_args_uses_legacy_for_old_versions() { + let args = parse_codex_mcp_args("codex version 0.39.0"); + assert_eq!(args, vec!["mcp".to_string(), "serve".to_string()]); + } + + #[test] + fn parse_codex_mcp_args_defaults_to_mcp_server() { + let args = parse_codex_mcp_args(""); + assert_eq!(args, vec!["mcp-server".to_string()]); + } +} diff --git a/src-tauri/src/commands/ai.rs b/src-tauri/src/commands/ai.rs new file mode 100644 index 0000000..8620b12 --- /dev/null +++ b/src-tauri/src/commands/ai.rs @@ -0,0 +1,438 @@ +use crate::chat::ChatMessage; +use crate::utils::{map_err, CmdResult}; +use futures::StreamExt; +use opencontext_core::search::SearchConfig; +use serde::{Deserialize, Serialize}; +use tauri::Emitter; + +const DEFAULT_AI_PROMPT: &str = "You are an AI within a journaling app. Your job is to help the user reflect on their thoughts in a thoughtful and kind manner. The user can never directly address you or directly respond to you. Try not to repeat what the user said, instead try to seed new ideas, encourage or debate. Keep your responses concise, but meaningful. Respond in the same language as the user."; + +fn get_config_value(key: &str) -> Option<String> { + let config_path = SearchConfig::json_config_path(); + if !config_path.exists() { + return None; + } + let content = std::fs::read_to_string(&config_path).ok()?; + let config: serde_json::Value = serde_json::from_str(&content).ok()?; + config + .get(key) + .and_then(|v| v.as_str()) + .map(|s| s.to_string()) +} + +#[tauri::command] +pub(crate) fn get_ai_config() -> CmdResult<serde_json::Value> { + let provider = get_config_value("AI_PROVIDER").unwrap_or_else(|| "openai".to_string()); + let api_key = get_config_value("AI_API_KEY"); + let api_base = + get_config_value("AI_API_BASE").unwrap_or_else(|| "https://api.openai.com/v1".to_string()); + let model = get_config_value("AI_MODEL").unwrap_or_else(|| "gpt-4o".to_string()); + let prompt = get_config_value("AI_PROMPT").unwrap_or_else(|| DEFAULT_AI_PROMPT.to_string()); + + let api_key_masked = api_key.as_ref().map(|key| { + if key.len() > 7 { + format!("{}...{}", &key[..3], &key[key.len() - 4..]) + } else { + "****".to_string() + } + }); + + Ok(serde_json::json!({ + "provider": provider, + "model": model, + "api_base": api_base, + "api_key_masked": api_key_masked, + "has_api_key": api_key.is_some() && !api_key.as_ref().unwrap().is_empty(), + "prompt": prompt, + "default_prompt": DEFAULT_AI_PROMPT + })) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct SaveAIConfigOptions { + provider: Option<String>, + api_key: Option<String>, + api_base: Option<String>, + model: Option<String>, + prompt: Option<String>, +} + +#[tauri::command] +pub(crate) fn save_ai_config(options: SaveAIConfigOptions) -> CmdResult<serde_json::Value> { + use std::collections::HashMap; + + let config_path = SearchConfig::json_config_path(); + + let mut config: HashMap<String, serde_json::Value> = if config_path.exists() { + let content = std::fs::read_to_string(&config_path).map_err(map_err)?; + serde_json::from_str(&content).unwrap_or_default() + } else { + HashMap::new() + }; + + if let Some(provider) = options.provider { + config.insert( + "AI_PROVIDER".to_string(), + serde_json::Value::String(provider), + ); + } + if let Some(key) = options.api_key { + if !key.is_empty() { + config.insert("AI_API_KEY".to_string(), serde_json::Value::String(key)); + } + } + if let Some(base) = options.api_base { + config.insert("AI_API_BASE".to_string(), serde_json::Value::String(base)); + } + if let Some(model) = options.model { + config.insert("AI_MODEL".to_string(), serde_json::Value::String(model)); + } + if let Some(prompt) = options.prompt { + config.insert("AI_PROMPT".to_string(), serde_json::Value::String(prompt)); + } + + if let Some(parent) = config_path.parent() { + std::fs::create_dir_all(parent).map_err(map_err)?; + } + + let content = serde_json::to_string_pretty(&config).map_err(map_err)?; + std::fs::write(&config_path, content).map_err(map_err)?; + + Ok(serde_json::json!({ + "success": true, + "config_path": config_path.to_string_lossy() + })) +} + +#[derive(Deserialize)] +pub(crate) struct AIChatOptions { + messages: Vec<ChatMessage>, + #[serde(rename = "requestId")] + request_id: Option<String>, + model: Option<String>, +} + +#[derive(Serialize, Clone)] +pub(crate) struct AIStreamEvent { + content: Option<String>, + done: Option<bool>, + error: Option<String>, +} + +pub(crate) fn extract_stream_content(value: &serde_json::Value) -> Option<String> { + if let Some(s) = value.as_str() { + return Some(s.to_string()); + } + if let Some(arr) = value.as_array() { + let mut parts: Vec<String> = Vec::new(); + for item in arr { + if let Some(s) = item.as_str() { + parts.push(s.to_string()); + continue; + } + if let Some(obj) = item.as_object() { + if let Some(text) = obj.get("text").and_then(|t| t.as_str()) { + parts.push(text.to_string()); + continue; + } + if let Some(text_obj) = obj.get("text").and_then(|t| t.as_object()) { + if let Some(val) = text_obj.get("value").and_then(|v| v.as_str()) { + parts.push(val.to_string()); + continue; + } + } + if let Some(content) = obj.get("content").and_then(|t| t.as_str()) { + parts.push(content.to_string()); + continue; + } + if let Some(content_obj) = obj.get("content").and_then(|t| t.as_object()) { + if let Some(val) = content_obj.get("value").and_then(|v| v.as_str()) { + parts.push(val.to_string()); + continue; + } + } + } + } + if !parts.is_empty() { + return Some(parts.join("")); + } + } + None +} + +pub(crate) fn content_for_ollama(content: &serde_json::Value) -> (String, Vec<String>) { + if let Some(s) = content.as_str() { + return (s.to_string(), Vec::new()); + } + if let Some(arr) = content.as_array() { + let mut text_parts: Vec<String> = Vec::new(); + let mut images: Vec<String> = Vec::new(); + for item in arr { + if let Some(obj) = item.as_object() { + if let Some(t) = obj.get("text").and_then(|v| v.as_str()) { + text_parts.push(t.to_string()); + } + if let Some(url) = obj + .get("image_url") + .and_then(|v| v.get("url")) + .and_then(|v| v.as_str()) + { + if let Some(encoded) = url.split("base64,").nth(1) { + images.push(encoded.to_string()); + } + } + } + } + return (text_parts.join("\n"), images); + } + (String::new(), Vec::new()) +} + +#[tauri::command] +pub(crate) async fn ai_chat(window: tauri::Window, options: AIChatOptions) -> CmdResult<()> { + let provider = get_config_value("AI_PROVIDER").unwrap_or_else(|| "openai".to_string()); + let api_key = get_config_value("AI_API_KEY"); + let api_base = + get_config_value("AI_API_BASE").unwrap_or_else(|| "https://api.openai.com/v1".to_string()); + let model = options + .model + .clone() + .filter(|value| !value.trim().is_empty()) + .unwrap_or_else(|| get_config_value("AI_MODEL").unwrap_or_else(|| "gpt-4o".to_string())); + + let event_name = match &options.request_id { + Some(id) => format!("ai-stream-{}", id), + None => "ai-stream".to_string(), + }; + + let client = reqwest::Client::new(); + + if provider == "ollama" { + let ollama_url = if api_base.contains("ollama") || api_base.contains("11434") { + api_base.clone() + } else { + "http://localhost:11434/api".to_string() + }; + + let messages: Vec<serde_json::Value> = options + .messages + .iter() + .map(|m| { + let (text, images) = content_for_ollama(&m.content); + let mut msg = serde_json::json!({ + "role": m.role, + "content": text + }); + if !images.is_empty() { + msg["images"] = serde_json::Value::Array( + images.into_iter().map(serde_json::Value::String).collect(), + ); + } + msg + }) + .collect(); + + let response = client + .post(format!("{}/chat", ollama_url)) + .header("Content-Type", "application/json") + .json(&serde_json::json!({ + "model": model, + "messages": messages, + "stream": true + })) + .send() + .await + .map_err(map_err)?; + + if !response.status().is_success() { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: None, + error: Some(format!("Ollama error: {}", response.status())), + }, + ); + return Ok(()); + } + + let mut stream = response.bytes_stream(); + while let Some(chunk_result) = stream.next().await { + match chunk_result { + Ok(chunk) => { + let text = String::from_utf8_lossy(&chunk); + for line in text.lines() { + if line.trim().is_empty() { + continue; + } + if let Ok(json) = serde_json::from_str::<serde_json::Value>(line) { + if let Some(content) = json + .get("message") + .and_then(|m| m.get("content")) + .and_then(|c| c.as_str()) + { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: Some(content.to_string()), + done: None, + error: None, + }, + ); + } + if json.get("done").and_then(|d| d.as_bool()).unwrap_or(false) { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: Some(true), + error: None, + }, + ); + } + } + } + } + Err(e) => { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: None, + error: Some(format!("Ollama error: {}", e)), + }, + ); + return Ok(()); + } + } + } + + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: Some(true), + error: None, + }, + ); + return Ok(()); + } + + let api_key = api_key.ok_or_else(|| "OpenAI API key not configured".to_string())?; + + let response = client + .post(format!("{}/chat/completions", api_base)) + .header("Content-Type", "application/json") + .header("Authorization", format!("Bearer {}", api_key)) + .json(&serde_json::json!({ + "model": model, + "messages": options.messages, + "stream": true + })) + .send() + .await + .map_err(map_err)?; + + if !response.status().is_success() { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: None, + error: Some(format!("OpenAI error: {}", response.status())), + }, + ); + return Ok(()); + } + + let mut stream = response.bytes_stream(); + while let Some(chunk_result) = stream.next().await { + match chunk_result { + Ok(chunk) => { + let text = String::from_utf8_lossy(&chunk); + for line in text.lines() { + if !line.starts_with("data: ") { + continue; + } + let content = line.trim_start_matches("data: ").trim(); + if content == "[DONE]" { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: Some(true), + error: None, + }, + ); + return Ok(()); + } + if let Ok(json) = serde_json::from_str::<serde_json::Value>(content) { + let text_chunk = json + .get("choices") + .and_then(|c| c.get(0)) + .and_then(|c| c.get("delta")) + .and_then(|d| d.get("content")) + .and_then(|c| extract_stream_content(c)); + if let Some(token) = text_chunk { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: Some(token), + done: None, + error: None, + }, + ); + } + } + } + } + Err(e) => { + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: None, + error: Some(format!("OpenAI error: {}", e)), + }, + ); + return Ok(()); + } + } + } + + let _ = window.emit( + &event_name, + AIStreamEvent { + content: None, + done: Some(true), + error: None, + }, + ); + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + + #[test] + fn extract_stream_content_handles_text_shapes() { + assert_eq!(extract_stream_content(&json!("ping")), Some("ping".to_string())); + assert_eq!( + extract_stream_content(&json!([{ "text": "a" }, { "content": { "value": "b" } }])), + Some("ab".to_string()) + ); + } + + #[test] + fn content_for_ollama_extracts_images() { + let (text, images) = content_for_ollama(&json!([ + { "text": "Hello" }, + { "image_url": { "url": "data:image/png;base64,ABC123" } } + ])); + assert_eq!(text, "Hello"); + assert_eq!(images, vec!["ABC123".to_string()]); + } +} diff --git a/src-tauri/src/commands/context.rs b/src-tauri/src/commands/context.rs new file mode 100644 index 0000000..427e80e --- /dev/null +++ b/src-tauri/src/commands/context.rs @@ -0,0 +1,383 @@ +use crate::utils::{map_err, CmdResult}; +use crate::AppState; +use opencontext_core::search::SearchConfig; +use serde::{Deserialize, Serialize}; +use tauri::State; + +// ===== Folder Commands ===== + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ListFoldersOptions { + all: Option<bool>, +} + +#[tauri::command] +pub(crate) fn list_folders( + state: State<AppState>, + options: Option<ListFoldersOptions>, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let folders = ctx + .list_folders(options.and_then(|o| o.all).unwrap_or(false)) + .map_err(map_err)?; + serde_json::to_value(&folders).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct CreateFolderOptions { + path: String, + description: Option<String>, +} + +#[tauri::command] +pub(crate) fn create_folder( + state: State<AppState>, + options: CreateFolderOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let folder = ctx + .create_folder(&options.path, options.description.as_deref()) + .map_err(map_err)?; + serde_json::to_value(&folder).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct RenameFolderOptions { + path: String, + new_name: String, +} + +#[tauri::command] +pub(crate) fn rename_folder( + state: State<AppState>, + options: RenameFolderOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let folder = ctx + .rename_folder(&options.path, &options.new_name) + .map_err(map_err)?; + serde_json::to_value(&folder).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct MoveFolderOptions { + path: String, + dest_folder_path: String, +} + +#[tauri::command] +pub(crate) fn move_folder( + state: State<AppState>, + options: MoveFolderOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let folder = ctx + .move_folder(&options.path, &options.dest_folder_path) + .map_err(map_err)?; + serde_json::to_value(&folder).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct RemoveFolderOptions { + path: String, + force: Option<bool>, +} + +#[tauri::command] +pub(crate) fn remove_folder(state: State<AppState>, options: RemoveFolderOptions) -> CmdResult<bool> { + let ctx = state.ctx.lock().map_err(map_err)?; + ctx.remove_folder(&options.path, options.force.unwrap_or(false)) + .map_err(map_err)?; + Ok(true) +} + +// ===== Document Commands ===== + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ListDocsOptions { + folder_path: String, + recursive: Option<bool>, +} + +#[tauri::command] +pub(crate) fn list_docs(state: State<AppState>, options: ListDocsOptions) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let docs = ctx + .list_docs(&options.folder_path, options.recursive.unwrap_or(false)) + .map_err(map_err)?; + serde_json::to_value(&docs).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct CreateDocOptions { + folder_path: String, + name: String, + description: Option<String>, +} + +#[tauri::command] +pub(crate) fn create_doc(state: State<AppState>, options: CreateDocOptions) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .create_doc(&options.folder_path, &options.name, options.description.as_deref()) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct MoveDocOptions { + doc_path: String, + dest_folder_path: String, +} + +#[tauri::command] +pub(crate) fn move_doc(state: State<AppState>, options: MoveDocOptions) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .move_doc(&options.doc_path, &options.dest_folder_path) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct RenameDocOptions { + doc_path: String, + new_name: String, +} + +#[tauri::command] +pub(crate) fn rename_doc(state: State<AppState>, options: RenameDocOptions) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .rename_doc(&options.doc_path, &options.new_name) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct RemoveDocOptions { + doc_path: String, +} + +#[tauri::command] +pub(crate) fn remove_doc(state: State<AppState>, options: RemoveDocOptions) -> CmdResult<bool> { + let ctx = state.ctx.lock().map_err(map_err)?; + ctx.remove_doc(&options.doc_path).map_err(map_err)?; + Ok(true) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct SetDescriptionOptions { + doc_path: String, + description: String, +} + +#[tauri::command] +pub(crate) fn set_doc_description( + state: State<AppState>, + options: SetDescriptionOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .set_doc_description(&options.doc_path, &options.description) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GetDocContentOptions { + path: String, +} + +#[derive(Serialize)] +pub(crate) struct DocContentResponse { + content: String, +} + +#[tauri::command] +pub(crate) fn get_doc_content( + state: State<AppState>, + options: GetDocContentOptions, +) -> CmdResult<DocContentResponse> { + let ctx = state.ctx.lock().map_err(map_err)?; + let content = ctx.get_doc_content(&options.path).map_err(map_err)?; + Ok(DocContentResponse { content }) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct SaveDocOptions { + path: String, + content: String, + description: Option<String>, +} + +#[tauri::command] +pub(crate) fn save_doc_content( + state: State<AppState>, + options: SaveDocOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .save_doc_content( + &options.path, + &options.content, + options.description.as_deref(), + ) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GetDocByIdOptions { + stable_id: String, +} + +#[tauri::command] +pub(crate) fn get_doc_by_id( + state: State<AppState>, + options: GetDocByIdOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx + .get_doc_by_stable_id(&options.stable_id) + .map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct GetDocMetaOptions { + path: String, +} + +#[tauri::command] +pub(crate) fn get_doc_meta( + state: State<AppState>, + options: GetDocMetaOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let doc = ctx.get_doc_meta(&options.path).map_err(map_err)?; + serde_json::to_value(&doc).map_err(map_err) +} + +// ===== Manifest Command ===== + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct ManifestOptions { + folder_path: String, + limit: Option<u32>, +} + +#[tauri::command] +pub(crate) fn generate_manifest( + state: State<AppState>, + options: ManifestOptions, +) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let manifest = ctx + .generate_manifest(&options.folder_path, options.limit.map(|v| v as usize)) + .map_err(map_err)?; + serde_json::to_value(&manifest).map_err(map_err) +} + +// ===== Environment Info Command ===== + +#[tauri::command] +pub(crate) fn get_env_info(state: State<AppState>) -> CmdResult<serde_json::Value> { + let ctx = state.ctx.lock().map_err(map_err)?; + let base_info = ctx.env_info(); + let config = &state.search_config; + + let masked_api_key = config.embedding.api_key.as_ref().map(|key| { + if key.len() > 4 { + format!("{}...{}", &key[..3], &key[key.len() - 4..]) + } else { + "****".to_string() + } + }); + + let info = serde_json::json!({ + "contexts_root": base_info.contexts_root, + "db_path": base_info.db_path, + "embedding_model": config.embedding.model, + "embedding_api_base": config.embedding.api_base, + "api_key_masked": masked_api_key, + "has_api_key": config.embedding.api_key.is_some() && !config.embedding.api_key.as_ref().unwrap().is_empty(), + "config_path": SearchConfig::json_config_path().to_string_lossy(), + "dimensions": config.embedding.dimensions, + }); + + Ok(info) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct SaveConfigOptions { + api_key: Option<String>, + api_base: Option<String>, + model: Option<String>, +} + +#[tauri::command] +pub(crate) fn save_config(options: SaveConfigOptions) -> CmdResult<serde_json::Value> { + use std::collections::HashMap; + + let config_path = SearchConfig::json_config_path(); + + let mut config: HashMap<String, serde_json::Value> = if config_path.exists() { + let content = std::fs::read_to_string(&config_path).map_err(map_err)?; + serde_json::from_str(&content).unwrap_or_default() + } else { + HashMap::new() + }; + + if let Some(key) = options.api_key { + if !key.is_empty() { + config.insert( + "EMBEDDING_API_KEY".to_string(), + serde_json::Value::String(key), + ); + config.remove("OPENAI_API_KEY"); + } + } + if let Some(base) = options.api_base { + config.insert( + "EMBEDDING_API_BASE".to_string(), + serde_json::Value::String(base), + ); + config.remove("OPENAI_BASE_URL"); + } + if let Some(model) = options.model { + config.insert( + "EMBEDDING_MODEL".to_string(), + serde_json::Value::String(model), + ); + } + + if let Some(parent) = config_path.parent() { + std::fs::create_dir_all(parent).map_err(map_err)?; + } + + let content = serde_json::to_string_pretty(&config).map_err(map_err)?; + std::fs::write(&config_path, content).map_err(map_err)?; + + Ok(serde_json::json!({ + "success": true, + "config_path": config_path.to_string_lossy() + })) +} diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs new file mode 100644 index 0000000..2a2fc44 --- /dev/null +++ b/src-tauri/src/commands/mod.rs @@ -0,0 +1,5 @@ +pub(crate) mod agent; +pub(crate) mod ai; +pub(crate) mod context; +pub(crate) mod search; +pub(crate) mod terminal; diff --git a/src-tauri/src/commands/search.rs b/src-tauri/src/commands/search.rs new file mode 100644 index 0000000..fbab724 --- /dev/null +++ b/src-tauri/src/commands/search.rs @@ -0,0 +1,164 @@ +use crate::utils::{map_err, CmdResult}; +use crate::AppState; +use opencontext_core::search::{IndexStats, Indexer, SearchOptions, SearchResults, Searcher}; +use serde::{Deserialize, Serialize}; +use tauri::{Emitter, State}; + +#[tauri::command] +pub(crate) async fn semantic_search( + state: State<'_, AppState>, + options: SearchOptions, +) -> CmdResult<SearchResults> { + let mut searcher_guard = state.searcher.lock().await; + + if searcher_guard.is_none() { + let searcher = Searcher::new(state.search_config.clone()) + .await + .map_err(map_err)?; + *searcher_guard = Some(searcher); + } + + let searcher = searcher_guard.as_ref().unwrap(); + searcher.search(options).await.map_err(map_err) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +pub(crate) struct BuildIndexOptions { + folder_path: Option<String>, +} + +#[tauri::command] +pub(crate) async fn build_search_index( + window: tauri::Window, + state: State<'_, AppState>, + _options: Option<BuildIndexOptions>, +) -> CmdResult<IndexStats> { + let contexts_root = { + let ctx = state.ctx.lock().map_err(map_err)?; + ctx.env_info().contexts_root + }; + + let docs = { + let ctx = state.ctx.lock().map_err(map_err)?; + let folders = ctx.list_folders(true).map_err(map_err)?; + let mut all_docs = Vec::new(); + for folder in folders { + if let Ok(docs) = ctx.list_docs(&folder.rel_path, false) { + all_docs.extend(docs); + } + } + all_docs + }; + + let mut indexer_guard = state.indexer.lock().await; + + if indexer_guard.is_none() { + let indexer = Indexer::new(state.search_config.clone(), contexts_root) + .await + .map_err(map_err)?; + *indexer_guard = Some(indexer); + } + + let indexer = indexer_guard.as_mut().unwrap(); + + let result = indexer + .build_all_with_progress(docs, |progress| { + let _ = window.emit("index-progress", &progress); + }) + .await + .map_err(map_err)?; + + let metadata_path = state.search_config.paths.get_index_metadata_path(); + let metadata = serde_json::json!({ + "lastFullBuild": std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64, + "totalChunks": result.total_chunks, + "totalDocs": result.total_docs, + }); + if let Some(parent) = metadata_path.parent() { + let _ = std::fs::create_dir_all(parent); + } + let _ = std::fs::write( + &metadata_path, + serde_json::to_string_pretty(&metadata).unwrap_or_default(), + ); + + Ok(result) +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct IndexStatus { + exists: bool, + chunk_count: usize, + last_updated: Option<u64>, +} + +#[tauri::command] +pub(crate) async fn get_index_status(state: State<'_, AppState>) -> CmdResult<IndexStatus> { + let contexts_root = { + let ctx = state.ctx.lock().map_err(map_err)?; + ctx.env_info().contexts_root + }; + + let mut indexer_guard = state.indexer.lock().await; + + if indexer_guard.is_none() { + let indexer = Indexer::new(state.search_config.clone(), contexts_root) + .await + .map_err(map_err)?; + *indexer_guard = Some(indexer); + } + + let indexer = indexer_guard.as_ref().unwrap(); + let exists = indexer.index_exists().await; + let stats = indexer.get_stats().await.map_err(map_err)?; + + let last_updated = { + let metadata_path = state.search_config.paths.get_index_metadata_path(); + if metadata_path.exists() { + std::fs::read_to_string(&metadata_path) + .ok() + .and_then(|content| serde_json::from_str::<serde_json::Value>(&content).ok()) + .and_then(|v| { + v.get("lastUpdated") + .and_then(|x| x.as_u64()) + .or_else(|| v.get("lastFullBuild").and_then(|x| x.as_u64())) + }) + } else { + None + } + }; + + Ok(IndexStatus { + exists, + chunk_count: stats.total_chunks, + last_updated, + }) +} + +#[tauri::command] +pub(crate) async fn clean_search_index(state: State<'_, AppState>) -> CmdResult<bool> { + let contexts_root = { + let ctx = state.ctx.lock().map_err(map_err)?; + ctx.env_info().contexts_root + }; + + let mut indexer_guard = state.indexer.lock().await; + + if indexer_guard.is_none() { + let indexer = Indexer::new(state.search_config.clone(), contexts_root) + .await + .map_err(map_err)?; + *indexer_guard = Some(indexer); + } + + let indexer = indexer_guard.as_mut().unwrap(); + indexer.clean().await.map_err(map_err)?; + + Ok(true) +} diff --git a/src-tauri/src/commands/terminal.rs b/src-tauri/src/commands/terminal.rs new file mode 100644 index 0000000..715d552 --- /dev/null +++ b/src-tauri/src/commands/terminal.rs @@ -0,0 +1,187 @@ +use crate::terminal_session::TerminalSession; +use crate::utils::{map_err, CmdResult}; +use crate::AppState; +use portable_pty::{native_pty_system, CommandBuilder, PtySize}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::io::Read; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::{Arc, Mutex}; +use tauri::{Emitter, State}; + +static TERMINAL_COUNTER: AtomicU64 = AtomicU64::new(1); + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct TerminalSpawnOptions { + id: Option<String>, + command: String, + args: Option<Vec<String>>, + cwd: Option<String>, + env: Option<HashMap<String, String>>, + cols: Option<u16>, + rows: Option<u16>, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct TerminalWriteOptions { + id: String, + data: String, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct TerminalResizeOptions { + id: String, + cols: u16, + rows: u16, +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +pub(crate) struct TerminalKillOptions { + id: String, +} + +#[derive(Serialize, Clone)] +pub(crate) struct TerminalOutputPayload { + id: String, + data: String, +} + +#[derive(Serialize, Clone)] +pub(crate) struct TerminalExitPayload { + id: String, + code: Option<i32>, +} + +#[tauri::command] +pub(crate) fn terminal_spawn( + app: tauri::AppHandle, + state: State<AppState>, + options: TerminalSpawnOptions, +) -> CmdResult<serde_json::Value> { + let pty_system = native_pty_system(); + let size = PtySize { + cols: options.cols.unwrap_or(80), + rows: options.rows.unwrap_or(24), + pixel_width: 0, + pixel_height: 0, + }; + let pair = pty_system.openpty(size).map_err(map_err)?; + + let mut cmd = CommandBuilder::new(options.command); + if let Some(args) = options.args { + cmd.args(args); + } + if let Some(cwd) = options.cwd { + cmd.cwd(cwd); + } + if let Some(env) = options.env { + for (key, value) in env { + cmd.env(key, value); + } + } + + let child = pair.slave.spawn_command(cmd).map_err(map_err)?; + let mut reader = pair.master.try_clone_reader().map_err(map_err)?; + let writer = pair.master.take_writer().map_err(map_err)?; + let master = pair.master; + + let id = options.id.unwrap_or_else(|| { + format!( + "term-{}", + TERMINAL_COUNTER.fetch_add(1, Ordering::Relaxed) + ) + }); + let output_id = id.clone(); + let output_app = app.clone(); + let child_handle = Arc::new(Mutex::new(child)); + let child_for_thread = child_handle.clone(); + + std::thread::spawn(move || { + let mut buffer = [0u8; 4096]; + loop { + match reader.read(&mut buffer) { + Ok(0) => break, + Ok(size) => { + let payload = TerminalOutputPayload { + id: output_id.clone(), + data: String::from_utf8_lossy(&buffer[..size]).to_string(), + }; + let _ = output_app.emit("terminal-output", payload); + } + Err(_) => break, + } + } + + let exit_code = child_for_thread + .lock() + .ok() + .and_then(|mut child| child.wait().ok()) + .map(|status| status.exit_code() as i32); + + let _ = output_app.emit( + "terminal-exit", + TerminalExitPayload { + id: output_id.clone(), + code: exit_code, + }, + ); + }); + + let session = TerminalSession { + master, + writer: Mutex::new(writer), + child: child_handle, + }; + state + .terminal_sessions + .lock() + .map_err(map_err)? + .insert(id.clone(), session); + + Ok(serde_json::json!({ "id": id })) +} + +#[tauri::command] +pub(crate) fn terminal_write(state: State<AppState>, options: TerminalWriteOptions) -> CmdResult<()> { + let sessions = state.terminal_sessions.lock().map_err(map_err)?; + let session = sessions + .get(&options.id) + .ok_or_else(|| "Terminal session not found".to_string())?; + let mut writer = session.writer.lock().map_err(map_err)?; + writer.write_all(options.data.as_bytes()).map_err(map_err)?; + writer.flush().ok(); + Ok(()) +} + +#[tauri::command] +pub(crate) fn terminal_resize(state: State<AppState>, options: TerminalResizeOptions) -> CmdResult<()> { + let sessions = state.terminal_sessions.lock().map_err(map_err)?; + let session = sessions + .get(&options.id) + .ok_or_else(|| "Terminal session not found".to_string())?; + session + .master + .resize(PtySize { + cols: options.cols, + rows: options.rows, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(map_err)?; + Ok(()) +} + +#[tauri::command] +pub(crate) fn terminal_kill(state: State<AppState>, options: TerminalKillOptions) -> CmdResult<()> { + let mut sessions = state.terminal_sessions.lock().map_err(map_err)?; + if let Some(session) = sessions.remove(&options.id) { + if let Ok(mut child) = session.child.lock() { + let _ = child.kill(); + } + } + Ok(()) +} diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0fedea8..890371e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,15 +1,27 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -use futures::StreamExt; +mod agent_rpc; +mod chat; +mod commands; +mod terminal_session; +mod utils; + +use crate::agent_rpc::AgentRpcSession; +use crate::terminal_session::TerminalSession; +use commands::{agent::*, ai::*, context::*, search::*, terminal::*}; use opencontext_core::events::{create_event_bus, SharedEventBus}; -use opencontext_core::search::{ - IndexStats, IndexSyncService, Indexer, SearchConfig, SearchOptions, SearchResults, Searcher, -}; +use opencontext_core::search::{IndexSyncService, Indexer, SearchConfig, Searcher}; use opencontext_core::{EnvOverrides, OpenContext}; -use serde::{Deserialize, Serialize}; -use std::sync::Mutex; -use tauri::{Emitter, State}; +use std::collections::HashMap; +use std::sync::{ + atomic::{AtomicBool, Ordering}, + Arc, Mutex, +}; +use tauri::image::Image; +use tauri::menu::{Menu, MenuItem}; +use tauri::tray::{MouseButton, TrayIconBuilder, TrayIconEvent}; +use tauri::{Manager, RunEvent, WindowEvent}; use tokio::sync::Mutex as AsyncMutex; struct AppState { @@ -19,1012 +31,29 @@ struct AppState { search_config: SearchConfig, #[allow(dead_code)] event_bus: SharedEventBus, + terminal_sessions: Mutex<HashMap<String, TerminalSession>>, + agent_rpc_sessions: Mutex<HashMap<String, Arc<AgentRpcSession>>>, } -// Tauri command 返回结果类型 -type CmdResult<T> = Result<T, String>; - -fn map_err<E: std::fmt::Display>(e: E) -> String { - e.to_string() -} - -// ===== Folder Commands ===== - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct ListFoldersOptions { - all: Option<bool>, -} - -#[tauri::command] -fn list_folders( - state: State<AppState>, - options: Option<ListFoldersOptions>, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let folders = ctx - .list_folders(options.and_then(|o| o.all).unwrap_or(false)) - .map_err(map_err)?; - serde_json::to_value(&folders).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct CreateFolderOptions { - path: String, - description: Option<String>, -} - -#[tauri::command] -fn create_folder( - state: State<AppState>, - options: CreateFolderOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let folder = ctx - .create_folder(&options.path, options.description.as_deref()) - .map_err(map_err)?; - serde_json::to_value(&folder).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct RenameFolderOptions { - path: String, - new_name: String, -} - -#[tauri::command] -fn rename_folder( - state: State<AppState>, - options: RenameFolderOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let folder = ctx - .rename_folder(&options.path, &options.new_name) - .map_err(map_err)?; - serde_json::to_value(&folder).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct MoveFolderOptions { - path: String, - dest_folder_path: String, -} - -#[tauri::command] -fn move_folder(state: State<AppState>, options: MoveFolderOptions) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let folder = ctx - .move_folder(&options.path, &options.dest_folder_path) - .map_err(map_err)?; - serde_json::to_value(&folder).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct RemoveFolderOptions { - path: String, - force: Option<bool>, -} - -#[tauri::command] -fn remove_folder(state: State<AppState>, options: RemoveFolderOptions) -> CmdResult<bool> { - let ctx = state.ctx.lock().map_err(map_err)?; - ctx.remove_folder(&options.path, options.force.unwrap_or(false)) - .map_err(map_err)?; - Ok(true) -} - -// ===== Document Commands ===== - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct ListDocsOptions { - folder_path: String, - recursive: Option<bool>, -} - -#[tauri::command] -fn list_docs(state: State<AppState>, options: ListDocsOptions) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let docs = ctx - .list_docs(&options.folder_path, options.recursive.unwrap_or(false)) - .map_err(map_err)?; - serde_json::to_value(&docs).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct CreateDocOptions { - folder_path: String, - name: String, - description: Option<String>, -} - -#[tauri::command] -fn create_doc(state: State<AppState>, options: CreateDocOptions) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .create_doc( - &options.folder_path, - &options.name, - options.description.as_deref(), - ) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct MoveDocOptions { - doc_path: String, - dest_folder_path: String, -} - -#[tauri::command] -fn move_doc(state: State<AppState>, options: MoveDocOptions) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .move_doc(&options.doc_path, &options.dest_folder_path) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct RenameDocOptions { - doc_path: String, - new_name: String, -} - -#[tauri::command] -fn rename_doc(state: State<AppState>, options: RenameDocOptions) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .rename_doc(&options.doc_path, &options.new_name) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct RemoveDocOptions { - doc_path: String, -} - -#[tauri::command] -fn remove_doc(state: State<AppState>, options: RemoveDocOptions) -> CmdResult<bool> { - let ctx = state.ctx.lock().map_err(map_err)?; - ctx.remove_doc(&options.doc_path).map_err(map_err)?; - Ok(true) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct SetDescriptionOptions { - doc_path: String, - description: String, -} - -#[tauri::command] -fn set_doc_description( - state: State<AppState>, - options: SetDescriptionOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .set_doc_description(&options.doc_path, &options.description) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct GetDocContentOptions { - path: String, -} - -#[derive(Serialize)] -struct DocContentResponse { - content: String, -} - -#[tauri::command] -fn get_doc_content( - state: State<AppState>, - options: GetDocContentOptions, -) -> CmdResult<DocContentResponse> { - let ctx = state.ctx.lock().map_err(map_err)?; - let content = ctx.get_doc_content(&options.path).map_err(map_err)?; - Ok(DocContentResponse { content }) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct SaveDocOptions { - path: String, - content: String, - description: Option<String>, -} - -#[tauri::command] -fn save_doc_content( - state: State<AppState>, - options: SaveDocOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .save_doc_content( - &options.path, - &options.content, - options.description.as_deref(), - ) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct GetDocByIdOptions { - stable_id: String, -} - -#[tauri::command] -fn get_doc_by_id( - state: State<AppState>, - options: GetDocByIdOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx - .get_doc_by_stable_id(&options.stable_id) - .map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct GetDocMetaOptions { - path: String, -} - -#[tauri::command] -fn get_doc_meta( - state: State<AppState>, - options: GetDocMetaOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let doc = ctx.get_doc_meta(&options.path).map_err(map_err)?; - serde_json::to_value(&doc).map_err(map_err) -} - -// ===== Manifest Command ===== - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct ManifestOptions { - folder_path: String, - limit: Option<u32>, -} - -#[tauri::command] -fn generate_manifest( - state: State<AppState>, - options: ManifestOptions, -) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let manifest = ctx - .generate_manifest(&options.folder_path, options.limit.map(|v| v as usize)) - .map_err(map_err)?; - serde_json::to_value(&manifest).map_err(map_err) -} - -// ===== Environment Info Command ===== - -#[tauri::command] -fn get_env_info(state: State<AppState>) -> CmdResult<serde_json::Value> { - let ctx = state.ctx.lock().map_err(map_err)?; - let base_info = ctx.env_info(); - let config = &state.search_config; - - // Mask API key for security (show only last 4 chars) - let masked_api_key = config.embedding.api_key.as_ref().map(|key| { - if key.len() > 4 { - format!("{}...{}", &key[..3], &key[key.len() - 4..]) - } else { - "****".to_string() - } - }); - - let info = serde_json::json!({ - "contexts_root": base_info.contexts_root, - "db_path": base_info.db_path, - "embedding_model": config.embedding.model, - "embedding_api_base": config.embedding.api_base, - "api_key_masked": masked_api_key, - "has_api_key": config.embedding.api_key.is_some() && !config.embedding.api_key.as_ref().unwrap().is_empty(), - "config_path": SearchConfig::json_config_path().to_string_lossy(), - "dimensions": config.embedding.dimensions, - }); - - Ok(info) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct SaveConfigOptions { - api_key: Option<String>, - api_base: Option<String>, - model: Option<String>, -} - -#[tauri::command] -fn save_config(options: SaveConfigOptions) -> CmdResult<serde_json::Value> { - use std::collections::HashMap; - - let config_path = SearchConfig::json_config_path(); - - // Read existing config or create new - let mut config: HashMap<String, serde_json::Value> = if config_path.exists() { - let content = std::fs::read_to_string(&config_path).map_err(map_err)?; - serde_json::from_str(&content).unwrap_or_default() - } else { - HashMap::new() - }; - - // Update only provided fields (use new naming convention) - if let Some(key) = options.api_key { - if !key.is_empty() { - config.insert( - "EMBEDDING_API_KEY".to_string(), - serde_json::Value::String(key), - ); - // Remove legacy key if it exists - config.remove("OPENAI_API_KEY"); - } - } - if let Some(base) = options.api_base { - config.insert( - "EMBEDDING_API_BASE".to_string(), - serde_json::Value::String(base), - ); - // Remove legacy key if it exists - config.remove("OPENAI_BASE_URL"); - } - if let Some(model) = options.model { - config.insert( - "EMBEDDING_MODEL".to_string(), - serde_json::Value::String(model), - ); - } - - // Ensure directory exists - if let Some(parent) = config_path.parent() { - std::fs::create_dir_all(parent).map_err(map_err)?; - } - - // Write config - let content = serde_json::to_string_pretty(&config).map_err(map_err)?; - std::fs::write(&config_path, content).map_err(map_err)?; - - Ok(serde_json::json!({ - "success": true, - "config_path": config_path.to_string_lossy() - })) -} - -// ===== AI Commands ===== - -const DEFAULT_AI_PROMPT: &str = "You are an AI within a journaling app. Your job is to help the user reflect on their thoughts in a thoughtful and kind manner. The user can never directly address you or directly respond to you. Try not to repeat what the user said, instead try to seed new ideas, encourage or debate. Keep your responses concise, but meaningful. Respond in the same language as the user."; - -fn get_config_value(key: &str) -> Option<String> { - let config_path = SearchConfig::json_config_path(); - if !config_path.exists() { - return None; - } - let content = std::fs::read_to_string(&config_path).ok()?; - let config: serde_json::Value = serde_json::from_str(&content).ok()?; - config - .get(key) - .and_then(|v| v.as_str()) - .map(|s| s.to_string()) -} - -#[tauri::command] -fn get_ai_config() -> CmdResult<serde_json::Value> { - let provider = get_config_value("AI_PROVIDER").unwrap_or_else(|| "openai".to_string()); - let api_key = get_config_value("AI_API_KEY"); - let api_base = - get_config_value("AI_API_BASE").unwrap_or_else(|| "https://api.openai.com/v1".to_string()); - let model = get_config_value("AI_MODEL").unwrap_or_else(|| "gpt-4o".to_string()); - let prompt = get_config_value("AI_PROMPT").unwrap_or_else(|| DEFAULT_AI_PROMPT.to_string()); - - let api_key_masked = api_key.as_ref().map(|key| { - if key.len() > 7 { - format!("{}...{}", &key[..3], &key[key.len() - 4..]) - } else { - "****".to_string() - } - }); - - Ok(serde_json::json!({ - "provider": provider, - "model": model, - "api_base": api_base, - "api_key_masked": api_key_masked, - "has_api_key": api_key.is_some() && !api_key.as_ref().unwrap().is_empty(), - "prompt": prompt, - "default_prompt": DEFAULT_AI_PROMPT - })) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -struct SaveAIConfigOptions { - provider: Option<String>, - api_key: Option<String>, - api_base: Option<String>, - model: Option<String>, - prompt: Option<String>, -} - -#[tauri::command] -fn save_ai_config(options: SaveAIConfigOptions) -> CmdResult<serde_json::Value> { - use std::collections::HashMap; - - let config_path = SearchConfig::json_config_path(); - - let mut config: HashMap<String, serde_json::Value> = if config_path.exists() { - let content = std::fs::read_to_string(&config_path).map_err(map_err)?; - serde_json::from_str(&content).unwrap_or_default() - } else { - HashMap::new() - }; - - if let Some(provider) = options.provider { - config.insert( - "AI_PROVIDER".to_string(), - serde_json::Value::String(provider), - ); - } - if let Some(key) = options.api_key { - if !key.is_empty() { - config.insert("AI_API_KEY".to_string(), serde_json::Value::String(key)); - } - } - if let Some(base) = options.api_base { - config.insert("AI_API_BASE".to_string(), serde_json::Value::String(base)); - } - if let Some(model) = options.model { - config.insert("AI_MODEL".to_string(), serde_json::Value::String(model)); - } - if let Some(prompt) = options.prompt { - config.insert("AI_PROMPT".to_string(), serde_json::Value::String(prompt)); - } - - if let Some(parent) = config_path.parent() { - std::fs::create_dir_all(parent).map_err(map_err)?; - } - - let content = serde_json::to_string_pretty(&config).map_err(map_err)?; - std::fs::write(&config_path, content).map_err(map_err)?; - - Ok(serde_json::json!({ - "success": true, - "config_path": config_path.to_string_lossy() - })) -} - -#[derive(Deserialize, Clone)] -struct ChatMessage { - role: String, - content: serde_json::Value, -} - -#[derive(Deserialize)] -struct AIChatOptions { - messages: Vec<ChatMessage>, - #[serde(rename = "requestId")] - request_id: Option<String>, -} - -#[derive(Serialize, Clone)] -struct AIStreamEvent { - content: Option<String>, - done: Option<bool>, - error: Option<String>, -} - -#[tauri::command] -async fn ai_chat(window: tauri::Window, options: AIChatOptions) -> CmdResult<()> { - let provider = get_config_value("AI_PROVIDER").unwrap_or_else(|| "openai".to_string()); - let api_key = get_config_value("AI_API_KEY"); - let api_base = - get_config_value("AI_API_BASE").unwrap_or_else(|| "https://api.openai.com/v1".to_string()); - let model = get_config_value("AI_MODEL").unwrap_or_else(|| "gpt-4o".to_string()); - - // 使用 request_id 构建唯一的事件名,支持并行请求 - let event_name = match &options.request_id { - Some(id) => format!("ai-stream-{}", id), - None => "ai-stream".to_string(), - }; - - // helper: extract text content from OpenAI/compatible streaming payloads - fn extract_stream_content(value: &serde_json::Value) -> Option<String> { - // Acceptable shapes: - // 1) "string" - // 2) [{ type: "text", text: "..." }] - // 3) [{ text: { value: "..." } }] - // 4) [{ content: "..." }] or content.value - // 5) ["partial", "chunks"] - if let Some(s) = value.as_str() { - return Some(s.to_string()); - } - if let Some(arr) = value.as_array() { - let mut parts: Vec<String> = Vec::new(); - for item in arr { - // item itself is a string - if let Some(s) = item.as_str() { - parts.push(s.to_string()); - continue; - } - if let Some(obj) = item.as_object() { - // text: "..." - if let Some(text) = obj.get("text").and_then(|t| t.as_str()) { - parts.push(text.to_string()); - continue; - } - // text: { value: "..." } - if let Some(text_obj) = obj.get("text").and_then(|t| t.as_object()) { - if let Some(val) = text_obj.get("value").and_then(|v| v.as_str()) { - parts.push(val.to_string()); - continue; - } - } - // content: "..." - if let Some(content) = obj.get("content").and_then(|t| t.as_str()) { - parts.push(content.to_string()); - continue; - } - // content: { value: "..." } - if let Some(content_obj) = obj.get("content").and_then(|t| t.as_object()) { - if let Some(val) = content_obj.get("value").and_then(|v| v.as_str()) { - parts.push(val.to_string()); - continue; - } - } - } - } - if !parts.is_empty() { - return Some(parts.join("")); - } - } - None - } - - let client = reqwest::Client::new(); - - fn content_for_ollama(content: &serde_json::Value) -> (String, Vec<String>) { - if let Some(s) = content.as_str() { - return (s.to_string(), Vec::new()); - } - if let Some(arr) = content.as_array() { - let mut text_parts: Vec<String> = Vec::new(); - let mut images: Vec<String> = Vec::new(); - for item in arr { - if let Some(obj) = item.as_object() { - if let Some(t) = obj.get("text").and_then(|v| v.as_str()) { - text_parts.push(t.to_string()); - } - if let Some(url) = obj - .get("image_url") - .and_then(|v| v.get("url")) - .and_then(|v| v.as_str()) - { - if let Some(encoded) = url.split("base64,").nth(1) { - images.push(encoded.to_string()); - } - } - } - } - return (text_parts.join("\n"), images); - } - (String::new(), Vec::new()) - } - - if provider == "ollama" { - // Ollama API - let ollama_url = if api_base.contains("ollama") || api_base.contains("11434") { - api_base.clone() - } else { - "http://localhost:11434/api".to_string() - }; - - let messages: Vec<serde_json::Value> = options - .messages - .iter() - .map(|m| { - let (text, images) = content_for_ollama(&m.content); - let mut msg = serde_json::json!({ - "role": m.role, - "content": text - }); - if !images.is_empty() { - msg["images"] = serde_json::Value::Array( - images.into_iter().map(serde_json::Value::String).collect(), - ); - } - msg - }) - .collect(); - - let response = client - .post(format!("{}/chat", ollama_url)) - .header("Content-Type", "application/json") - .json(&serde_json::json!({ - "model": model, - "messages": messages, - "stream": true - })) - .send() - .await - .map_err(map_err)?; - - if !response.status().is_success() { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: None, - error: Some(format!("Ollama error: {}", response.status())), - }, - ); - return Ok(()); - } - - let mut stream = response.bytes_stream(); - while let Some(chunk_result) = stream.next().await { - match chunk_result { - Ok(chunk) => { - let text = String::from_utf8_lossy(&chunk); - for line in text.lines() { - if line.trim().is_empty() { - continue; - } - if let Ok(json) = serde_json::from_str::<serde_json::Value>(line) { - if let Some(content) = json - .get("message") - .and_then(|m| m.get("content")) - .and_then(|c| c.as_str()) - { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: Some(content.to_string()), - done: None, - error: None, - }, - ); - } - if json.get("done").and_then(|d| d.as_bool()).unwrap_or(false) { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: Some(true), - error: None, - }, - ); - } - } - } - } - Err(e) => { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: None, - error: Some(e.to_string()), - }, - ); - break; - } - } - } - } else { - // OpenAI-compatible API - let Some(key) = api_key else { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: None, - error: Some("AI API key not configured".to_string()), - }, - ); - return Ok(()); - }; - - let messages: Vec<serde_json::Value> = options - .messages - .iter() - .map(|m| { - serde_json::json!({ - "role": m.role, - "content": m.content - }) - }) - .collect(); - - let response = client - .post(format!("{}/chat/completions", api_base)) - .header("Content-Type", "application/json") - .header("Authorization", format!("Bearer {}", key)) - .json(&serde_json::json!({ - "model": model, - "messages": messages, - "stream": true, - "max_tokens": 500 - })) - .send() - .await - .map_err(map_err)?; - - if !response.status().is_success() { - let error_text = response.text().await.unwrap_or_default(); - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: None, - error: Some(format!("API error: {}", error_text)), - }, - ); - return Ok(()); - } - - let mut stream = response.bytes_stream(); - while let Some(chunk_result) = stream.next().await { - match chunk_result { - Ok(chunk) => { - let text = String::from_utf8_lossy(&chunk); - for line in text.lines() { - if !line.starts_with("data: ") { - continue; - } - let data = &line[6..]; - if data == "[DONE]" { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: Some(true), - error: None, - }, - ); - break; - } - if let Ok(json) = serde_json::from_str::<serde_json::Value>(data) { - // Try delta.content (streaming) - let delta_content = json - .get("choices") - .and_then(|c| c.get(0)) - .and_then(|c| c.get("delta")) - .and_then(|d| d.get("content")) - .and_then(|c| extract_stream_content(c)); - - // Fallback to full message.content (non-stream or some providers) - let message_content = json - .get("choices") - .and_then(|c| c.get(0)) - .and_then(|c| c.get("message")) - .and_then(|m| m.get("content")) - .and_then(|c| extract_stream_content(c)); - - if let Some(content) = delta_content.or(message_content) { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: Some(content), - done: None, - error: None, - }, - ); - } - } - } - } - Err(e) => { - let _ = window.emit( - &event_name, - AIStreamEvent { - content: None, - done: None, - error: Some(e.to_string()), - }, - ); - break; - } - } - } - } - - Ok(()) -} - -// ===== Search Commands ===== - -#[tauri::command] -async fn semantic_search( - state: State<'_, AppState>, - options: SearchOptions, -) -> CmdResult<SearchResults> { - let mut searcher_guard = state.searcher.lock().await; - - // Initialize searcher if not already done - if searcher_guard.is_none() { - let searcher = Searcher::new(state.search_config.clone()) - .await - .map_err(map_err)?; - *searcher_guard = Some(searcher); +fn hide_main_window<R: tauri::Runtime>(window: &tauri::WebviewWindow<R>) { + let _ = window.hide(); + let _ = window.set_skip_taskbar(true); + #[cfg(target_os = "macos")] + { + let _ = window.app_handle().set_dock_visibility(false); } - - let searcher = searcher_guard.as_ref().unwrap(); - searcher.search(options).await.map_err(map_err) -} - -#[derive(Deserialize)] -#[serde(rename_all = "camelCase")] -#[allow(dead_code)] -struct BuildIndexOptions { - folder_path: Option<String>, } -#[tauri::command] -async fn build_search_index( - window: tauri::Window, - state: State<'_, AppState>, - _options: Option<BuildIndexOptions>, -) -> CmdResult<IndexStats> { - // Get contexts_root from OpenContext - let contexts_root = { - let ctx = state.ctx.lock().map_err(map_err)?; - ctx.env_info().contexts_root - }; - - // Get all documents - let docs = { - let ctx = state.ctx.lock().map_err(map_err)?; - // List all folders first - let folders = ctx.list_folders(true).map_err(map_err)?; - let mut all_docs = Vec::new(); - for folder in folders { - if let Ok(docs) = ctx.list_docs(&folder.rel_path, false) { - all_docs.extend(docs); - } +fn show_main_window<R: tauri::Runtime>(app: &tauri::AppHandle<R>) { + if let Some(window) = app.get_webview_window("main") { + #[cfg(target_os = "macos")] + { + let _ = app.set_dock_visibility(true); } - all_docs - }; - - let mut indexer_guard = state.indexer.lock().await; - - // Initialize indexer if not already done - if indexer_guard.is_none() { - let indexer = Indexer::new(state.search_config.clone(), contexts_root) - .await - .map_err(map_err)?; - *indexer_guard = Some(indexer); + let _ = window.set_skip_taskbar(false); + let _ = window.show(); + let _ = window.set_focus(); } - - let indexer = indexer_guard.as_mut().unwrap(); - - // Build with progress callback - let result = indexer - .build_all_with_progress(docs, |progress| { - // Emit progress event to frontend - let _ = window.emit("index-progress", &progress); - }) - .await - .map_err(map_err)?; - - // Save index metadata with last update time - let metadata_path = state.search_config.paths.get_index_metadata_path(); - let metadata = serde_json::json!({ - "lastFullBuild": std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_millis() as u64, - "totalChunks": result.total_chunks, - "totalDocs": result.total_docs, - }); - if let Some(parent) = metadata_path.parent() { - let _ = std::fs::create_dir_all(parent); - } - let _ = std::fs::write( - &metadata_path, - serde_json::to_string_pretty(&metadata).unwrap_or_default(), - ); - - Ok(result) -} - -#[derive(Serialize)] -#[serde(rename_all = "camelCase")] -struct IndexStatus { - exists: bool, - chunk_count: usize, - last_updated: Option<u64>, -} - -#[tauri::command] -async fn get_index_status(state: State<'_, AppState>) -> CmdResult<IndexStatus> { - // Get contexts_root from OpenContext - let contexts_root = { - let ctx = state.ctx.lock().map_err(map_err)?; - ctx.env_info().contexts_root - }; - - let mut indexer_guard = state.indexer.lock().await; - - if indexer_guard.is_none() { - let indexer = Indexer::new(state.search_config.clone(), contexts_root) - .await - .map_err(map_err)?; - *indexer_guard = Some(indexer); - } - - let indexer = indexer_guard.as_ref().unwrap(); - let exists = indexer.index_exists().await; - let stats = indexer.get_stats().await.map_err(map_err)?; - - // Try to read last update time from index-metadata.json - // Prefer lastUpdated (any update), fallback to lastFullBuild (full rebuild only) - let last_updated = { - let metadata_path = state.search_config.paths.get_index_metadata_path(); - if metadata_path.exists() { - std::fs::read_to_string(&metadata_path) - .ok() - .and_then(|content| serde_json::from_str::<serde_json::Value>(&content).ok()) - .and_then(|v| { - v.get("lastUpdated") - .and_then(|x| x.as_u64()) - .or_else(|| v.get("lastFullBuild").and_then(|x| x.as_u64())) - }) - } else { - None - } - }; - - Ok(IndexStatus { - exists, - chunk_count: stats.total_chunks, - last_updated, - }) -} - -#[tauri::command] -async fn clean_search_index(state: State<'_, AppState>) -> CmdResult<bool> { - // Get contexts_root from OpenContext - let contexts_root = { - let ctx = state.ctx.lock().map_err(map_err)?; - ctx.env_info().contexts_root - }; - - let mut indexer_guard = state.indexer.lock().await; - - if indexer_guard.is_none() { - let indexer = Indexer::new(state.search_config.clone(), contexts_root) - .await - .map_err(map_err)?; - *indexer_guard = Some(indexer); - } - - let indexer = indexer_guard.as_mut().unwrap(); - indexer.clean().await.map_err(map_err)?; - - Ok(true) } fn main() { @@ -1044,7 +73,12 @@ fn main() { let sync_config = search_config.clone(); let sync_contexts_root = contexts_root.clone(); - tauri::Builder::default() + let allow_close = Arc::new(AtomicBool::new(false)); + let allow_close_for_setup = allow_close.clone(); + let allow_close_for_run = allow_close.clone(); + + let app = tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_clipboard_manager::init()) .manage(AppState { ctx: Mutex::new(ctx), @@ -1052,14 +86,54 @@ fn main() { indexer: AsyncMutex::new(None), search_config, event_bus, + terminal_sessions: Mutex::new(HashMap::new()), + agent_rpc_sessions: Mutex::new(HashMap::new()), }) .setup(move |app| { + let minimize_to_tray_id: Option<tauri::menu::MenuId>; + // Create Edit menu with predefined items for macOS // PredefinedMenuItem items automatically trigger native WebView edit actions #[cfg(target_os = "macos")] { use tauri::menu::{Menu, PredefinedMenuItem, Submenu}; + let minimize_to_tray = + MenuItem::with_id(app, "minimize_to_tray", "Minimize to Tray", true, None::<&str>)?; + minimize_to_tray_id = Some(minimize_to_tray.id().clone()); + + let app_version = app.package_info().version.to_string(); + let mut about_builder = tauri::menu::AboutMetadataBuilder::new() + .version(Some(app_version.clone())) + .short_version(Some(app_version)); + let about_icon = Image::from_bytes(include_bytes!("../icons/about-icon.png")) + .ok() + .or_else(|| app.default_window_icon().cloned()) + .or_else(|| Image::from_bytes(include_bytes!("../icons/128x128@2x.png")).ok()); + if let Some(icon) = about_icon { + about_builder = about_builder.icon(Some(icon)); + } + let about_metadata = about_builder.build(); + + let app_menu = Submenu::with_items( + app, + app.package_info().name.clone(), + true, + &[ + &PredefinedMenuItem::about(app, None, Some(about_metadata)).unwrap(), + &PredefinedMenuItem::separator(app).unwrap(), + &PredefinedMenuItem::services(app, None).unwrap(), + &PredefinedMenuItem::separator(app).unwrap(), + &PredefinedMenuItem::hide(app, None).unwrap(), + &PredefinedMenuItem::hide_others(app, None).unwrap(), + &PredefinedMenuItem::show_all(app, None).unwrap(), + &PredefinedMenuItem::separator(app).unwrap(), + &minimize_to_tray, + &PredefinedMenuItem::quit(app, None).unwrap(), + ], + ) + .unwrap(); + let edit_menu = Submenu::with_items( app, "Edit", @@ -1076,9 +150,106 @@ fn main() { ) .unwrap(); - let menu = Menu::with_items(app, &[&edit_menu]).unwrap(); + let menu = Menu::with_items(app, &[&app_menu, &edit_menu]).unwrap(); app.set_menu(menu).unwrap(); } + #[cfg(not(target_os = "macos"))] + { + minimize_to_tray_id = None; + } + + let app_handle = app.handle(); + + let tray_show = MenuItem::with_id( + app_handle, + "tray_show", + "Show OpenContext", + true, + None::<&str>, + )?; + let tray_quit = MenuItem::with_id( + app_handle, + "tray_quit", + "Quit OpenContext", + true, + None::<&str>, + )?; + let tray_menu = Menu::with_items(app_handle, &[&tray_show, &tray_quit])?; + let tray_show_id = tray_show.id().clone(); + let tray_quit_id = tray_quit.id().clone(); + let tray_app_handle = app_handle.clone(); + let allow_close_for_menu = allow_close_for_setup.clone(); + let minimize_to_tray_id = minimize_to_tray_id.clone(); + let mut tray_builder = TrayIconBuilder::new() + .menu(&tray_menu) + .tooltip("OpenContext") + .show_menu_on_left_click(false) + .on_menu_event(move |app, event| { + if event.id == tray_show_id { + show_main_window(app); + } else if event.id == tray_quit_id { + allow_close_for_menu.store(true, Ordering::SeqCst); + app.exit(0); + } else if minimize_to_tray_id + .as_ref() + .map_or(false, |id| event.id == *id) + { + if let Some(window) = app.get_webview_window("main") { + hide_main_window(&window); + } + } + }); + + #[cfg(target_os = "macos")] + { + if let Ok(icon) = Image::from_bytes(include_bytes!( + "../icons/tray-icon-template-36.png" + )) { + tray_builder = tray_builder.icon(icon); + } else if let Ok(icon) = Image::from_bytes(include_bytes!( + "../icons/tray-icon-template-64.png" + )) { + tray_builder = tray_builder.icon(icon); + } else if let Some(icon) = app.default_window_icon().cloned() { + tray_builder = tray_builder.icon(icon); + } + tray_builder = tray_builder.icon_as_template(true); + } + #[cfg(not(target_os = "macos"))] + { + if let Some(icon) = app.default_window_icon().cloned() { + tray_builder = tray_builder.icon(icon); + } else if let Ok(icon) = Image::from_bytes(include_bytes!("../icons/64x64.png")) { + tray_builder = tray_builder.icon(icon); + } + } + + tray_builder + .on_tray_icon_event(move |_tray, event| match event { + TrayIconEvent::Click { + button: MouseButton::Left, + .. + } + | TrayIconEvent::DoubleClick { .. } => { + show_main_window(&tray_app_handle); + } + _ => {} + }) + .build(app_handle)?; + + if let Some(window) = app_handle.get_webview_window("main") { + let window_for_event = window.clone(); + let allow_close_for_window = allow_close_for_setup.clone(); + window.on_window_event(move |event| { + if let WindowEvent::CloseRequested { api, .. } = event { + if allow_close_for_window.load(Ordering::SeqCst) { + return; + } + api.prevent_close(); + hide_main_window(&window_for_event); + } + }); + } // Start index sync service in background // Use tauri::async_runtime::spawn which works with Tauri's runtime management @@ -1113,6 +284,10 @@ fn main() { generate_manifest, get_env_info, save_config, + terminal_spawn, + terminal_write, + terminal_resize, + terminal_kill, // Search commands semantic_search, build_search_index, @@ -1122,7 +297,37 @@ fn main() { get_ai_config, save_ai_config, ai_chat, + agent_sessions_load, + agent_sessions_save, + codex_exec, + codex_kill, + codex_permission_response, + acp_permission_response, + claude_exec, + claude_kill, + opencode_run, + opencode_kill, + agent_preflight, + agent_models_get, + agent_models_save, + oc_exec, ]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + .build(tauri::generate_context!()) + .expect("error while building tauri application"); + + app.run(move |app_handle, event| { + if let RunEvent::ExitRequested { .. } = event { + allow_close_for_run.store(true, Ordering::SeqCst); + } + #[cfg(target_os = "macos")] + if let RunEvent::Reopen { + has_visible_windows, + .. + } = event + { + if !has_visible_windows { + show_main_window(app_handle); + } + } + }); } diff --git a/src-tauri/src/terminal_session.rs b/src-tauri/src/terminal_session.rs new file mode 100644 index 0000000..909b00a --- /dev/null +++ b/src-tauri/src/terminal_session.rs @@ -0,0 +1,9 @@ +use portable_pty::MasterPty; +use std::io::Write; +use std::sync::{Arc, Mutex}; + +pub(crate) struct TerminalSession { + pub(crate) master: Box<dyn MasterPty + Send>, + pub(crate) writer: Mutex<Box<dyn Write + Send>>, + pub(crate) child: Arc<Mutex<Box<dyn portable_pty::Child + Send + Sync>>>, +} diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs new file mode 100644 index 0000000..f6fd5e9 --- /dev/null +++ b/src-tauri/src/utils.rs @@ -0,0 +1,7 @@ +use std::fmt::Display; + +pub type CmdResult<T> = Result<T, String>; + +pub fn map_err<E: Display>(e: E) -> String { + e.to_string() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ae0aee6..9d9adea 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -2,7 +2,7 @@ "$schema": "https://schema.tauri.app/config/2", "productName": "OpenContext", "version": "1.0.0", - "identifier": "com.opencontext.app", + "identifier": "com.contextlab.opencontext", "build": { "beforeDevCommand": "npm run ui:dev", "devUrl": "http://localhost:5173", @@ -43,4 +43,3 @@ } } } - diff --git a/src/core/agents.js b/src/core/agents.js index d981591..6728011 100644 --- a/src/core/agents.js +++ b/src/core/agents.js @@ -1,10 +1,37 @@ const path = require('path'); +const os = require('os'); const fs = require('fs'); const fse = require('fs-extra'); const { BASE_ROOT, CONTEXTS_ROOT } = require('./store/index.js'); const AGENTS_DIR = path.join(BASE_ROOT, 'agents'); const GLOBAL_AGENTS_PATH = path.join(AGENTS_DIR, 'AGENTS.md'); +const MCP_SERVER_NAME = 'opencontext'; +const MCP_SERVER_CONFIG = { + command: 'oc', + args: ['mcp'] +}; +const COMMAND_GUARDRAILS = [ + 'Safety: You may read from `.idea`, but do NOT write inside `.idea`.', + 'OpenContext docs must live under the global contexts root; never create or edit docs in the project workspace.' +].join('\n'); +const DEFAULT_TOOL_SELECTION = { + cursor: true, + claude: true, + codex: true +}; + +function getClaudeConfigDir() { + return process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), '.claude'); +} + +function getCodexConfigDir() { + return process.env.CODEX_HOME || path.join(os.homedir(), '.codex'); +} + +function getCursorConfigDir() { + return path.join(os.homedir(), '.cursor'); +} function writeFileIfChanged(targetPath, content) { if (fs.existsSync(targetPath)) { @@ -133,6 +160,7 @@ function agentsTemplate() { '## Safety boundaries', '- Do not auto-run destructive operations (delete/move/rename). Explain and ask for approval first.', '- Do not store secrets (tokens/passwords/private data). If needed, store only the process to obtain/configure them (not the values).', + '- You may read from `.idea`, but do NOT write inside `.idea`.', '', 'Follow these rules so any agent can use OpenContext reliably and auditably.', '<!-- OPENCONTEXT:END -->' @@ -177,210 +205,280 @@ function projectAgentsTemplate() { '<!-- OPENCONTEXT:END -->' ].join('\n'); } -const CURSOR_WORKFLOWS = [ +const COMMAND_DEFS = [ { - filename: 'opencontext-help.md', - content: `--- Cursor Command: opencontext-help.md --- ---- -title: /opencontext-help -description: Start here — choose the right OpenContext command (beginner-friendly) ---- - -You are assisting a user who may be new to OpenContext. Your goal is to route them to the right workflow and execute it. - -1. Ask the user which of these they want (pick one): - - A) "I want to find what I've written before" → use **/opencontext-search** - - B) "I want to load background/context for the current task" → use **/opencontext-context** - - C) "I want to create a new doc/idea" → use **/opencontext-create** - - D) "I want to save/update a doc with what we just learned" → use **/opencontext-iterate** -2. If they are unsure, default to **/opencontext-context**. -3. Then run the chosen command and continue the task. ---- End Command --- -` + name: 'opencontext-help', + title: '/opencontext-help', + description: 'Start here — choose the right OpenContext command (beginner-friendly)', + body: [ + 'You are assisting a user who may be new to OpenContext. Your goal is to route them to the right workflow and execute it.', + '', + '1. Ask the user which of these they want (pick one):', + ' - A) "I want to find what I\'ve written before" → use **/opencontext-search**', + ' - B) "I want to load background/context for the current task" → use **/opencontext-context**', + ' - C) "I want to create a new doc/idea" → use **/opencontext-create**', + ' - D) "I want to save/update a doc with what we just learned" → use **/opencontext-iterate**', + '2. If they are unsure, default to **/opencontext-context**.', + '3. Then run the chosen command and continue the task.' + ].join('\n') }, { - filename: 'opencontext-context.md', - content: `--- Cursor Command: opencontext-context.md --- ---- -title: /opencontext-context -description: Load relevant OpenContext docs for the current task (safe, no index build) ---- - -Goal: Load enough context from OpenContext so you can proceed confidently. -Safety: Do NOT trigger index builds by default (no \`oc index build\`). Prefer manifest + direct reads. - -1. If the target space/folder is unclear, run \`oc folder ls --all\` and ask the user to choose a folder (no guessing when ambiguous). -2. Run \`oc context manifest <folder_path> --limit 10\` (or \`oc context manifest . --limit 10\` for broad context). -3. Load 3–10 relevant files by \`abs_path\` and extract: - - Key constraints, decisions, and current state - - Open questions / risks -4. Cite sources: - - Prefer stable links \`oc://doc/<stable_id>\` when available in the manifest output. - - Use \`abs_path\` + \`range\` only for line-level evidence. -5. Summarize the loaded context and proceed with the user’s task. ---- End Command --- -` + name: 'opencontext-context', + title: '/opencontext-context', + description: 'Load relevant OpenContext docs for the current task (safe, no index build)', + body: [ + 'Goal: Load enough context from OpenContext so you can proceed confidently.', + 'Safety: Do NOT trigger index builds by default (no `oc index build`). Prefer manifest + direct reads.', + '', + '1. If the target space/folder is unclear, run `oc folder ls --all` and ask the user to choose a folder (no guessing when ambiguous).', + '2. Run `oc context manifest <folder_path> --limit 10` (or `oc context manifest . --limit 10` for broad context).', + '3. Load 3–10 relevant files by `abs_path` and extract:', + ' - Key constraints, decisions, and current state', + ' - Open questions / risks', + '4. Cite sources:', + ' - Prefer stable links `oc://doc/<stable_id>` when available in the manifest output.', + ' - Use `abs_path` + `range` only for line-level evidence.', + '5. Summarize the loaded context and proceed with the user’s task.' + ].join('\n') }, { - filename: 'opencontext-search.md', - content: `--- Cursor Command: opencontext-search.md --- ---- -title: /opencontext-search -description: Search OpenContext to find the right docs (safe, no index build by default) ---- - -Goal: Help the user find relevant existing docs quickly. -Safety: Do NOT trigger index builds by default (cost may be unpredictable). - -1. Ask the user for a short query (or infer one from the conversation). -2. Try search in read-only mode: - - Run: \`oc search \"<query>\" --format json --limit 10\` - - If it succeeds, use results to pick candidate docs and then use **/opencontext-context** (manifest + reads) to load and cite them. -3. If search fails due to missing index: - - Fall back to \`oc context manifest <folder> --limit 20\` and use doc \`description\` + filename triage. - - Optionally suggest a controlled index build, but do NOT run it unless the user explicitly approves. -4. Cite sources using stable links \`oc://doc/<stable_id>\` when available. ---- End Command --- -` + name: 'opencontext-search', + title: '/opencontext-search', + description: 'Search OpenContext to find the right docs (safe, no index build by default)', + body: [ + 'Goal: Help the user find relevant existing docs quickly.', + 'Safety: Do NOT trigger index builds by default (cost may be unpredictable).', + '', + '1. Ask the user for a short query (or infer one from the conversation).', + '2. Try search in read-only mode:', + ' - Run: `oc search "<query>" --format json --limit 10`', + ' - If it succeeds, use results to pick candidate docs and then use **/opencontext-context** (manifest + reads) to load and cite them.', + '3. If search fails due to missing index:', + ' - Fall back to `oc context manifest <folder> --limit 20` and use doc `description` + filename triage.', + ' - Optionally suggest a controlled index build, but do NOT run it unless the user explicitly approves.', + '4. Cite sources using stable links `oc://doc/<stable_id>` when available.' + ].join('\n') }, { - filename: 'opencontext-create.md', - content: `--- Cursor Command: opencontext-create.md --- ---- -title: /opencontext-create -description: Create a new idea or problem statement inside OpenContext ---- - -0. **Blocking requirement**: Do NOT answer the user’s broader question until the document has been created and minimally populated. -1. Infer the target space from recent context; if unclear, ask the user to specify the space (no default). -2. Derive a concise idea title & summary from the current conversation, then generate a slug (kebab-case; fallback to \`idea-<YYYYMMDDHHmm>\`). Only ask the user if information is insufficient. -3. Determine the target folder path under OpenContext (do NOT assume fixed subfolders like \`ideas/\`): - - If the user gave a target folder, use it. - - Otherwise, infer a sensible default and confirm with the user (or ask the user to choose). - - If you are unsure what folders exist, run \`oc folder ls --all\` and pick/ask accordingly. -4. Ensure the target folder exists by running \`oc folder create <folder_path> -d "<folder description>"\` (safe to rerun). -5. **[CRITICAL - DO NOT SKIP]** You MUST run: \`oc doc create <folder_path> <slug>.md -d "<title>"\` to create the document. - - This command registers the document in the OpenContext database. - - DO NOT directly create the file with Write tool - you MUST use \`oc doc create\` first. - - The command will output the file path after successful creation. -6. After \`oc doc create\` succeeds, set \`CONTEXTS_ROOT=\${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}\` and edit \`\${CONTEXTS_ROOT}/<folder_path>/<slug>.md\` directly - do not mirror it inside the project repo. -7. Populate that file with: - - Title / problem statement - - Initial description/background - - “Related Requests” list (can be empty placeholders) -8. Return the document path and immediately keep organizing content (no follow-up questions unless critical info is missing). ---- End Command --- -` + name: 'opencontext-create', + title: '/opencontext-create', + description: 'Create a new idea or problem statement inside OpenContext', + body: [ + '0. **Blocking requirement**: Do NOT answer the user’s broader question until the document has been created and minimally populated.', + '1. Infer the target space from recent context; if unclear, ask the user to specify the space (no default).', + '2. Derive a concise idea title & summary from the current conversation, then generate a slug (kebab-case; fallback to `idea-<YYYYMMDDHHmm>`). Only ask the user if information is insufficient.', + '3. Determine the target folder path under OpenContext (do NOT assume fixed subfolders like `ideas/`):', + ' - If the user gave a target folder, use it.', + ' - Otherwise, infer a sensible default and confirm with the user (or ask the user to choose).', + ' - If you are unsure what folders exist, run `oc folder ls --all` and pick/ask accordingly.', + '4. Ensure the target folder exists by running `oc folder create <folder_path> -d "<folder description>"` (safe to rerun).', + '5. **[CRITICAL - DO NOT SKIP]** You MUST run: `oc doc create <folder_path> <slug>.md -d "<title>"` to create the document.', + ' - This command registers the document in the OpenContext database.', + ' - DO NOT directly create the file with Write tool - you MUST use `oc doc create` first.', + ' - The command will output the file path after successful creation.', + '6. After `oc doc create` succeeds, set `CONTEXTS_ROOT=${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}` and edit `${CONTEXTS_ROOT}/<folder_path>/<slug>.md` directly - do not mirror it inside the project repo.', + '7. Populate that file with:', + ' - Title / problem statement', + ' - Initial description/background', + ' - “Related Requests” list (can be empty placeholders)', + '8. Return the document path and immediately keep organizing content (no follow-up questions unless critical info is missing).' + ].join('\n') }, { - filename: 'opencontext-iterate.md', - content: `--- Cursor Command: opencontext-iterate.md --- ---- -title: /opencontext-iterate -description: Enrich an existing idea with additional context from OpenContext ---- - -1. Identify the target idea document from the current discussion (ask only if ambiguous). Set \`CONTEXTS_ROOT=\${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}\` and load \`\${CONTEXTS_ROOT}/<target_doc>\` to understand existing sections (never duplicate it under the project repo). -2. Derive the owning space from the doc path (e.g., \`<space>/.../foo.md\` → space \`<space>\`). If the space is unclear, run \`oc folder ls --all\`. Then run \`oc context manifest <space> --limit 10\` (or \`oc context manifest . --limit 10\`) and load each \`abs_path\` for inspiration. -3. Update the Markdown directly in the global file: - - Ensure a \`## Iteration Log\` section exists (create if missing). - - Append a new entry timestamped with local date/time in readable format (e.g., \`2025-12-11 17:00\` or \`Dec 11, 2025 5:00 PM\`) that summarizes insights, cites referenced docs, and lists next steps/risks. - - **Citation rule (DO NOT SKIP)**: when citing any OpenContext doc in \`Iteration Log\`, you MUST use the stable link format \`oc://doc/<stable_id>\` as the primary reference (example: \`[label](oc://doc/<stable_id>)\`). Only add \`abs_path\` and/or \`range\` when you specifically need auditability or line-level evidence. Do NOT cite using only file paths if \`stable_id\` is available in the manifest output. - - Refresh any other impacted sections (Overview, Requirements, Implementation notes, etc.). -4. Save the updated document and call \`oc doc set-desc <target_doc> "<latest summary>"\` so the manifest reflects the newest iteration. -5. Report the updated doc path plus which references were used. ---- End Command --- -` - }, + name: 'opencontext-iterate', + title: '/opencontext-iterate', + description: 'Enrich an existing idea with additional context from OpenContext', + body: [ + '1. Identify the target idea document from the current discussion (ask only if ambiguous). Set `CONTEXTS_ROOT=${OPENCONTEXT_CONTEXTS_ROOT:-$HOME/.opencontext/contexts}` and load `${CONTEXTS_ROOT}/<target_doc>` to understand existing sections (never duplicate it under the project repo).', + '2. Derive the owning space from the doc path (e.g., `<space>/.../foo.md` → space `<space>`). If the space is unclear, run `oc folder ls --all`. Then run `oc context manifest <space> --limit 10` (or `oc context manifest . --limit 10`) and load each `abs_path` for inspiration.', + '3. Update the Markdown directly in the global file:', + ' - Ensure a `## Iteration Log` section exists (create if missing).', + ' - Append a new entry timestamped with local date/time in readable format (e.g., `2025-12-11 17:00` or `Dec 11, 2025 5:00 PM`) that summarizes insights, cites referenced docs, and lists next steps/risks.', + ' - **Citation rule (DO NOT SKIP)**: when citing any OpenContext doc in `Iteration Log`, you MUST use the stable link format `oc://doc/<stable_id>` as the primary reference (example: `[label](oc://doc/<stable_id>)`). Only add `abs_path` and/or `range` when you specifically need auditability or line-level evidence. Do NOT cite using only file paths if `stable_id` is available in the manifest output.', + ' - Refresh any other impacted sections (Overview, Requirements, Implementation notes, etc.).', + '4. Save the updated document and call `oc doc set-desc <target_doc> "<latest summary>"` so the manifest reflects the newest iteration.', + '5. Report the updated doc path plus which references were used.' + ].join('\n') + } ]; -function ensureProjectArtifacts(projectRoot) { - const outputs = []; - if (!projectRoot) { - return outputs; +function formatCursorCommand(def) { + const body = `${COMMAND_GUARDRAILS}\n\n${def.body.trim()}`; + return [ + `--- Cursor Command: ${def.name}.md ---`, + '---', + `title: ${def.title}`, + `description: ${def.description}`, + '---', + '', + body, + '--- End Command ---', + '' + ].join('\n'); +} + +function formatClaudeCommand(def) { + const body = `${COMMAND_GUARDRAILS}\n\n${def.body.trim()}`; + return [ + `# ${def.title}`, + '', + def.description, + '', + body, + '' + ].join('\n'); +} + +function formatSkill(def) { + const body = `${COMMAND_GUARDRAILS}\n\n${def.body.trim()}`; + return [ + '---', + `name: ${def.name}`, + `description: ${def.description}`, + '---', + '', + `# ${def.title}`, + '', + body, + '' + ].join('\n'); +} + +function normalizeToolSelection(selection) { + if (!selection) { + return { ...DEFAULT_TOOL_SELECTION }; } - const projectAgentsPath = path.join(projectRoot, 'AGENTS.md'); - const block = projectAgentsTemplate(); - if (upsertOpenContextBlockInFile(projectAgentsPath, block)) { - outputs.push(projectAgentsPath); + return { + cursor: selection.cursor === undefined ? DEFAULT_TOOL_SELECTION.cursor : Boolean(selection.cursor), + claude: selection.claude === undefined ? DEFAULT_TOOL_SELECTION.claude : Boolean(selection.claude), + codex: selection.codex === undefined ? DEFAULT_TOOL_SELECTION.codex : Boolean(selection.codex) + }; +} + +function normalizeArgs(args) { + return Array.isArray(args) ? args : []; +} + +function argsEqual(a, b) { + const left = normalizeArgs(a); + const right = normalizeArgs(b); + if (left.length !== right.length) return false; + for (let i = 0; i < left.length; i += 1) { + if (left[i] !== right[i]) return false; } - const cursorDir = path.join(projectRoot, '.cursor'); - fse.ensureDirSync(cursorDir); - - const commandsDir = path.join(cursorDir, 'commands'); - fse.ensureDirSync(commandsDir); - - // Clean up deprecated/removed files so they no longer clutter the workspace. - // (These files are generated artifacts; safe to remove when the command set changes.) - const deprecatedInCursorDir = ['opencontext-manifest.md']; - const deprecatedInCommandsDir = [ - 'opencontext-propose.md', - 'opencontext-merge.md', - 'opencontext-archive.md', - 'opencontext-implement.md', - 'opencontext-refer.md', - ]; - - deprecatedInCursorDir.forEach((name) => { - const p = path.join(cursorDir, name); + return true; +} + +function upsertMcpConfig(mcpConfigPath, serverName, serverConfig) { + let mcpConfig = { mcpServers: {} }; + if (fs.existsSync(mcpConfigPath)) { try { - if (fs.existsSync(p)) fs.unlinkSync(p); + mcpConfig = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8')); } catch { - // ignore cleanup errors + mcpConfig = { mcpServers: {} }; } - }); - deprecatedInCommandsDir.forEach((name) => { - const p = path.join(commandsDir, name); - try { - if (fs.existsSync(p)) fs.unlinkSync(p); - } catch { - // ignore cleanup errors + } + + if (!mcpConfig.mcpServers || typeof mcpConfig.mcpServers !== 'object') { + mcpConfig.mcpServers = {}; + } + + const existing = mcpConfig.mcpServers[serverName]; + if (existing && existing.command === serverConfig.command && argsEqual(existing.args, serverConfig.args)) { + return false; + } + + mcpConfig.mcpServers[serverName] = { ...(existing || {}), ...serverConfig }; + fse.ensureDirSync(path.dirname(mcpConfigPath)); + fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + '\n', 'utf8'); + return true; +} + +function ensureUserCommands(toolsSelection) { + const outputs = []; + const tools = normalizeToolSelection(toolsSelection); + const cursorCommandsDir = tools.cursor ? path.join(getCursorConfigDir(), 'commands') : null; + const claudeCommandsDir = tools.claude ? path.join(getClaudeConfigDir(), 'commands') : null; + + COMMAND_DEFS.forEach((def) => { + if (cursorCommandsDir) { + const cursorPath = path.join(cursorCommandsDir, `${def.name}.md`); + if (writeFileIfChanged(cursorPath, formatCursorCommand(def))) { + outputs.push(cursorPath); + } + } + if (claudeCommandsDir) { + const claudePath = path.join(claudeCommandsDir, `${def.name}.md`); + if (writeFileIfChanged(claudePath, formatClaudeCommand(def))) { + outputs.push(claudePath); + } } }); + return outputs; +} - CURSOR_WORKFLOWS.forEach((workflow) => { - const filePath = path.join(commandsDir, workflow.filename); - if (writeFileIfChanged(filePath, workflow.content)) { - outputs.push(filePath); +function ensureSkillsAtPath(skillsDir) { + const outputs = []; + COMMAND_DEFS.forEach((def) => { + const skillDir = path.join(skillsDir, def.name); + const skillPath = path.join(skillDir, 'SKILL.md'); + if (writeFileIfChanged(skillPath, formatSkill(def))) { + outputs.push(skillPath); } }); + return outputs; +} - // Generate MCP configuration for Cursor - const mcpConfigPath = path.join(cursorDir, 'mcp.json'); - const ocMcpConfig = { - command: 'oc', - args: ['mcp'] - }; - - let mcpConfig = { mcpServers: {} }; - if (fs.existsSync(mcpConfigPath)) { - try { - const existing = JSON.parse(fs.readFileSync(mcpConfigPath, 'utf8')); - mcpConfig = existing; - if (!mcpConfig.mcpServers) { - mcpConfig.mcpServers = {}; - } - } catch { - // If parse fails, start fresh - mcpConfig = { mcpServers: {} }; - } +function ensureUserSkills(toolsSelection) { + const outputs = []; + const tools = normalizeToolSelection(toolsSelection); + if (tools.cursor) { + outputs.push(...ensureSkillsAtPath(path.join(getCursorConfigDir(), 'skills'))); } - - // Only update if opencontext config is missing or different - const existingOc = mcpConfig.mcpServers.opencontext; - if (!existingOc || existingOc.command !== ocMcpConfig.command || - JSON.stringify(existingOc.args) !== JSON.stringify(ocMcpConfig.args)) { - mcpConfig.mcpServers.opencontext = ocMcpConfig; - fs.writeFileSync(mcpConfigPath, JSON.stringify(mcpConfig, null, 2) + '\n', 'utf8'); - outputs.push(mcpConfigPath); + if (tools.claude) { + outputs.push(...ensureSkillsAtPath(path.join(getClaudeConfigDir(), 'skills'))); } + if (tools.codex) { + outputs.push(...ensureSkillsAtPath(path.join(getCodexConfigDir(), 'skills'))); + } + return outputs; +} + +function ensureUserMcpConfigs(toolsSelection) { + const outputs = []; + const tools = normalizeToolSelection(toolsSelection); + const targets = []; + if (tools.cursor) targets.push(path.join(getCursorConfigDir(), 'mcp.json')); + if (tools.claude) targets.push(path.join(getClaudeConfigDir(), 'mcp.json')); + if (tools.codex) targets.push(path.join(getCodexConfigDir(), 'mcp.json')); + + targets.forEach((mcpConfigPath) => { + if (upsertMcpConfig(mcpConfigPath, MCP_SERVER_NAME, MCP_SERVER_CONFIG)) { + outputs.push(mcpConfigPath); + } + }); + return outputs; +} +function ensureProjectArtifacts(projectRoot) { + const outputs = []; + if (!projectRoot) { + return outputs; + } + const projectAgentsPath = path.join(projectRoot, 'AGENTS.md'); + const block = projectAgentsTemplate(); + if (upsertOpenContextBlockInFile(projectAgentsPath, block)) { + outputs.push(projectAgentsPath); + } return outputs; } -function syncAgentsArtifacts(projectRoot) { +function syncAgentsArtifacts(projectRoot, options = {}) { const outputs = []; outputs.push(...ensureGlobalArtifacts()); + outputs.push(...ensureUserCommands(options.tools)); + outputs.push(...ensureUserSkills(options.tools)); + outputs.push(...ensureUserMcpConfigs(options.tools)); outputs.push(...ensureProjectArtifacts(projectRoot)); return outputs; } @@ -389,4 +487,3 @@ module.exports = { syncAgentsArtifacts, GLOBAL_AGENTS_PATH }; - diff --git a/src/core/native.js b/src/core/native.js index 1bf10d1..471663c 100644 --- a/src/core/native.js +++ b/src/core/native.js @@ -13,6 +13,8 @@ const path = require('path'); let native = null; let nativeError = null; +let npmError = null; +let localError = null; let initialized = false; let loadedFrom = null; @@ -29,6 +31,7 @@ function loadNative() { loadedFrom = 'npm'; return; } catch (e) { + npmError = e; // Not installed via npm, try local } @@ -38,6 +41,7 @@ function loadNative() { native = require(nativePath); loadedFrom = 'local'; } catch (e) { + localError = e; nativeError = e; } } @@ -72,7 +76,9 @@ function get() { `OpenContext native bindings not available.\n` + ` If installed via npm: try reinstalling the package\n` + ` If developing locally: cd crates/opencontext-node && npm run build\n` + - `Error: ${nativeError?.message || 'unknown'}` + ` If optional deps were skipped: npm install -g @aicontextlab/cli --include=optional\n` + + `Error (npm): ${npmError?.message || 'unknown'}\n` + + `Error (local): ${localError?.message || 'unknown'}` ); } return native; @@ -88,7 +94,9 @@ function require_() { `OpenContext native bindings not available.\n` + ` If installed via npm: try reinstalling the package\n` + ` If developing locally: cd crates/opencontext-node && npm run build\n` + - `Error: ${nativeError?.message || 'unknown'}` + ` If optional deps were skipped: npm install -g @aicontextlab/cli --include=optional\n` + + `Error (npm): ${npmError?.message || 'unknown'}\n` + + `Error (local): ${localError?.message || 'unknown'}` ); } } diff --git a/src/core/search/formatter.js b/src/core/search/formatter.js index 70f1b7a..09d9d94 100644 --- a/src/core/search/formatter.js +++ b/src/core/search/formatter.js @@ -28,6 +28,7 @@ function normalizeResult(result) { entry_id: result.entry_id || result.entryId, entry_date: result.entry_date || result.entryDate, entry_created_at: result.entry_created_at || result.entryCreatedAt, + idea_box: result.idea_box || result.ideaBox, }; } diff --git a/src/core/store-native.js b/src/core/store-native.js index 069213a..20e7c7e 100644 --- a/src/core/store-native.js +++ b/src/core/store-native.js @@ -209,9 +209,14 @@ function saveDocContent(options) { } /** - * Generate manifest + * Generate manifest with drift detection. + * + * Returns documents registered in SQLite for the folder, plus a list of + * `*.md` files that exist on disk but are NOT indexed (i.e. someone wrote + * a file directly via Write/Edit, bypassing oc_create_doc/saveDocContent). + * * @param {{ folderPath: string, limit?: number }} options - * @returns {Array<DocManifestEntry>} + * @returns {{ items: Array<DocManifestEntry>, unindexed_files: string[] }} */ function generateManifest(options) { return handleResult(native.get().generateManifest({ @@ -220,6 +225,18 @@ function generateManifest(options) { })); } +/** + * Reconcile a folder: scan filesystem under `folderPath` and INSERT a + * `docs` row for every `*.md` that has none. Does NOT rebuild embeddings. + * @param {{ folderPath: string }} options + * @returns {string[]} rel_paths of newly registered docs + */ +function reconcileFolder(options) { + return handleResult(native.get().reconcileFolder({ + folderPath: options.folderPath, + })); +} + module.exports = { // Availability checks isNativeAvailable, @@ -243,4 +260,5 @@ module.exports = { getDocContent, saveDocContent, generateManifest, + reconcileFolder, }; diff --git a/src/core/store/index.js b/src/core/store/index.js index 8cbbf33..4f5fc2f 100644 --- a/src/core/store/index.js +++ b/src/core/store/index.js @@ -43,6 +43,7 @@ module.exports = { getDocContent: nativeStore.getDocContent, saveDocContent: nativeStore.saveDocContent, generateManifest: nativeStore.generateManifest, + reconcileFolder: nativeStore.reconcileFolder, // Constants DEFAULT_BASE_ROOT, diff --git a/src/mcp/server.js b/src/mcp/server.js index eb87576..c612765 100644 --- a/src/mcp/server.js +++ b/src/mcp/server.js @@ -13,6 +13,8 @@ const server = new McpServer({ }); function toToolResponse(data) { + // Wrap arrays in object to comply with MCP structuredContent requirement (must be record, not array) + const structured = Array.isArray(data) ? { items: data } : data; return { content: [ { @@ -20,7 +22,7 @@ function toToolResponse(data) { text: JSON.stringify(data, null, 2) } ], - structuredContent: data + structuredContent: structured }; } @@ -56,11 +58,12 @@ server.registerTool( server.registerTool( 'oc_create_doc', { - description: '在指定目录创建空文档(可附带描述)', + description: + 'REQUIRED for any file under ~/.opencontext/contexts/. Using Write or Edit there bypasses the SQLite index — the file becomes invisible to oc_manifest and oc_search. Always use this tool to create docs, oc_save_doc to write/replace body, and oc_set_doc_desc to update description. Creates an empty document (with optional description) in the given folder.', inputSchema: z.object({ - folder_path: z.string().min(1).describe('目标目录,相对 contexts/'), - doc_name: z.string().min(1).describe('文件名,例如 "plan.md"'), - description: z.string().optional().describe('文档描述') + folder_path: z.string().min(1).describe('Target folder, relative to contexts/'), + doc_name: z.string().min(1).describe('File name, e.g. "plan.md"'), + description: z.string().optional().describe('Document description') }) }, async ({ folder_path, doc_name, description }) => { @@ -72,10 +75,11 @@ server.registerTool( server.registerTool( 'oc_set_doc_desc', { - description: '更新文档描述,便于后续搜索/筛选', + description: + 'Update a document description. REQUIRED for metadata edits under ~/.opencontext/contexts/ — Write/Edit on the .md file there bypasses the SQLite index. Use oc_create_doc to create, this tool to update description, and oc_save_doc to update body.', inputSchema: z.object({ - doc_path: z.string().min(1).describe('文档路径,例如 "project-a/plan.md"'), - description: z.string().describe('新的描述内容') + doc_path: z.string().min(1).describe('Document path, e.g. "project-a/plan.md"'), + description: z.string().describe('New description text') }) }, async ({ doc_path, description }) => { @@ -84,23 +88,86 @@ server.registerTool( } ); +server.registerTool( + 'oc_save_doc', + { + description: + 'Write/replace the body of a document under ~/.opencontext/contexts/. REQUIRED instead of Write/Edit on the .md file — going through this tool keeps the SQLite index, updated_at timestamp, and search-index sync events consistent. The doc must already exist (use oc_create_doc first). Optionally updates the description in the same call.', + inputSchema: z.object({ + doc_path: z.string().min(1).describe('Document path relative to contexts/, e.g. "project-a/plan.md"'), + content: z.string().describe('Full new file content (replaces existing body)'), + description: z.string().optional().describe('Optional new description; leave empty to keep current') + }) + }, + async ({ doc_path, content, description }) => { + const result = store.saveDocContent({ + docPath: doc_path, + content, + description, + }); + return toToolResponse(result); + } +); + server.registerTool( 'oc_manifest', { - description: '输出该目录(含子目录)文档的 JSON manifest,供 Agent 按路径读取上下文', + description: + 'List all docs in a folder (recursive). Use this when you know the project/folder name — oc_search matches content only, not names. Returns { items, unindexed_files }: `items` are docs registered in SQLite; `unindexed_files` lists *.md files present on disk but missing from the index (created via Write/Edit, bypassing oc_create_doc). When `unindexed_files` is non-empty, run oc_reconcile_folder.', inputSchema: z.object({ - folder_path: z.string().min(1).describe('相对 contexts/ 的目录路径'), + folder_path: z.string().min(1).describe('Folder path relative to contexts/'), limit: z .number() .int() .positive() .optional() - .describe('可选,限制返回文档数量') + .describe('Optional cap on number of items returned') }) }, async ({ folder_path, limit }) => { - const rows = store.generateManifest({ folderPath: folder_path, limit: limit ?? null }); - return toToolResponse(rows); + const result = store.generateManifest({ folderPath: folder_path, limit: limit ?? 10 }); + const unindexed = result.unindexed_files || []; + const payload = { + items: result.items, + unindexed_files: unindexed, + }; + if (unindexed.length > 0) { + payload.warning = + `${unindexed.length} files exist on disk but are not indexed. ` + + `Call oc_reconcile_folder({ folder_path: "${folder_path}" }) to register them, ` + + `or delete them. Files: ${unindexed.join(', ')}`; + } + return { + content: [ + { + type: 'text', + text: JSON.stringify(payload, null, 2), + }, + ], + structuredContent: payload, + }; + } +); + +server.registerTool( + 'oc_reconcile_folder', + { + description: + 'Register *.md files that exist on disk under ~/.opencontext/contexts/<folder_path> but are missing from the SQLite index. Fast — does NOT recompute embeddings (run `oc index build` for that). Use after oc_manifest reports `unindexed_files`, or after pulling docs from git.', + inputSchema: z.object({ + folder_path: z.string().min(1).describe('Folder path relative to contexts/') + }) + }, + async ({ folder_path }) => { + const added = store.reconcileFolder({ folderPath: folder_path }); + const payload = { + added, + count: added.length, + hint: added.length > 0 + ? 'Run `oc index build` to compute embeddings for the new docs.' + : 'No drift detected.', + }; + return toToolResponse(payload); } ); @@ -108,7 +175,7 @@ server.registerTool( server.registerTool( 'oc_search', { - description: 'Search OpenContext documents by query. Returns matching content/docs/folders with file paths and stable_ids for citation.', + description: 'Search OpenContext documents by CONTENT (body text). Does NOT match folder names or file names — to browse a known project use oc_manifest({ folder_path: "project-name" }) instead. Returns matching content/docs/folders with file paths and stable_ids for citation.', inputSchema: z.object({ query: z.string().min(1).describe('Search query (keywords or natural language)'), limit: z.number().int().positive().optional().describe('Number of results (default 5)'), diff --git a/src/ui/mobile.html b/src/ui/mobile.html new file mode 100644 index 0000000..2d3fce3 --- /dev/null +++ b/src/ui/mobile.html @@ -0,0 +1,12 @@ +<!doctype html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>OpenContext Editor + + +
+ + + diff --git a/src/ui/server.js b/src/ui/server.js index 2358686..b0be722 100644 --- a/src/ui/server.js +++ b/src/ui/server.js @@ -340,7 +340,7 @@ async function createUiServer({ host = '127.0.0.1', port = 3222 }) { // AI Chat Stream API (SSE) app.post('/api/ai/chat', async (req, res) => { try { - const { messages } = req.body || {}; + const { messages, model: modelOverride } = req.body || {}; if (!messages || !Array.isArray(messages)) { return res.status(400).json({ error: 'Missing messages array' }); } @@ -370,7 +370,9 @@ async function createUiServer({ host = '127.0.0.1', port = 3222 }) { const provider = config.get('AI_PROVIDER') || 'openai'; const apiKey = config.get('AI_API_KEY'); const apiBase = config.get('AI_API_BASE') || 'https://api.openai.com/v1'; - const model = config.get('AI_MODEL') || 'gpt-4o'; + const model = typeof modelOverride === 'string' && modelOverride.trim().length > 0 + ? modelOverride.trim() + : (config.get('AI_MODEL') || 'gpt-4o'); // Set SSE headers res.setHeader('Content-Type', 'text/event-stream'); @@ -635,7 +637,8 @@ async function createUiServer({ host = '127.0.0.1', port = 3222 }) { doc_type: r.docType || r.doc_type, entry_id: r.entryId || r.entry_id, entry_date: r.entryDate || r.entry_date, - entry_created_at: r.entryCreatedAt || r.entry_created_at + entry_created_at: r.entryCreatedAt || r.entry_created_at, + idea_box: r.ideaBox || r.idea_box })) }); } catch (error) { diff --git a/src/ui/src/App.jsx b/src/ui/src/App.jsx index be845f7..1bd5ebf 100644 --- a/src/ui/src/App.jsx +++ b/src/ui/src/App.jsx @@ -10,7 +10,8 @@ import { PencilIcon, FolderPlusIcon, DocumentPlusIcon, - ClipboardDocumentIcon + ClipboardDocumentIcon, + SparklesIcon } from '@heroicons/react/24/outline'; // Tiptap Editor (migrated from PlateJS) import { TiptapMarkdownEditor, TiptapMarkdownViewer } from './components/TiptapMarkdown'; @@ -27,8 +28,8 @@ import { useIdeaLoader } from './hooks/useIdeaLoader'; import { useScrollSpy } from './hooks/useScrollSpy'; import { useTauriDrag } from './hooks/useTauriDrag.jsx'; import { PageSkeleton, SidebarSkeleton } from './components/Skeletons'; -import { LanguageSwitcher } from './components/LanguageSwitcher'; import IdeaTimeline from './components/IdeaTimeline'; +import AgentSidebar from './components/agent/AgentSidebar'; import * as api from './api'; import { writeClipboardText } from './utils/clipboard'; import { @@ -42,14 +43,16 @@ import { import { basename, dirname } from './utils/path'; import IdeaTimelineDemo from './demo/IdeaTimelineDemo'; -// Notion-like Light Mode Styles +// Notion-like Styles const BASE_DOCUMENT_CLASSES = [ 'prose', - 'prose-slate', + 'prose-zinc', + 'dark:prose-invert', 'max-w-none', // Headings 'prose-headings:text-gray-900', 'prose-headings:font-semibold', + 'dark:prose-headings:text-zinc-100', 'prose-h1:text-4xl', 'prose-h1:font-bold', 'prose-h1:mb-4', @@ -63,10 +66,12 @@ const BASE_DOCUMENT_CLASSES = [ 'prose-p:text-gray-700', 'prose-p:leading-7', 'prose-p:my-2', + 'dark:prose-p:text-zinc-300', // Lists 'prose-li:text-gray-700', 'prose-ul:my-2', 'prose-ol:my-2', + 'dark:prose-li:text-zinc-300', // Code 'prose-code:text-red-500', 'prose-code:bg-gray-100', @@ -79,18 +84,28 @@ const BASE_DOCUMENT_CLASSES = [ 'prose-pre:text-gray-800', 'prose-pre:border', 'prose-pre:border-gray-200', + 'dark:prose-code:text-rose-300', + 'dark:prose-code:bg-zinc-800', + 'dark:prose-pre:bg-zinc-900', + 'dark:prose-pre:text-zinc-200', + 'dark:prose-pre:border-zinc-700', // Links 'prose-a:text-gray-600', 'prose-a:underline', 'prose-a:decoration-gray-300', 'hover:prose-a:text-blue-600', + 'dark:prose-a:text-zinc-300', + 'dark:prose-a:decoration-zinc-600', + 'dark:hover:prose-a:text-cyan-300', 'transition-colors', // Blockquote 'prose-blockquote:border-l-4', 'prose-blockquote:border-gray-300', 'prose-blockquote:pl-4', 'prose-blockquote:italic', - 'prose-blockquote:text-gray-600' + 'prose-blockquote:text-gray-600', + 'dark:prose-blockquote:border-zinc-600', + 'dark:prose-blockquote:text-zinc-400' ].join(' '); const EDITOR_CONTENT_CLASSES = `${BASE_DOCUMENT_CLASSES} w-full min-h-[calc(100vh-12rem)] px-12 py-8 focus:outline-none focus-visible:outline-none`; @@ -185,6 +200,10 @@ export default function App() { const location = useLocation(); const navigate = useNavigate(); const params = useParams(); + const ideaBoxParam = useMemo(() => { + const searchParams = new URLSearchParams(location.search || ''); + return searchParams.get('box') || ''; + }, [location.search]); // 根据路由路径确定当前视图 const view = useMemo(() => { @@ -200,11 +219,14 @@ export default function App() { const [save, dispatchSave] = useReducer(saveReducer, saveInitialState); const [sidebarWidth, setSidebarWidth] = useState(260); const [isResizingSidebar, setIsResizingSidebar] = useState(false); + const [terminalWidth, setTerminalWidth] = useState(450); + const [isResizingTerminal, setIsResizingTerminal] = useState(false); const [ideaFocusEntryId, setIdeaFocusEntryId] = useState(null); // activeTocId is computed by useScrollSpy // UI States const [contextMenu, setContextMenu] = useState(null); // { x, y, target } + const [isTerminalOpen, setIsTerminalOpen] = useState(true); // dialog state replaces modal state const [dialog, setDialog] = useState(null); // { isOpen, type, title, message, placeholder, initialValue, confirmText, cancelText, isDestructive, kind, payload } // Search modal state @@ -215,6 +237,7 @@ export default function App() { const autoSaveTimerRef = useRef(null); const saveDocumentRef = useRef(null); + const lastIdeaBoxParamRef = useRef(ideaBoxParam); const folderError = useCallback( (err) => { @@ -311,6 +334,18 @@ export default function App() { // Idea module const ideaLoader = useIdeaLoader({ api }); + const buildIdeaRoute = useCallback((box, date) => { + const safeBox = box ? encodeURIComponent(box) : ''; + const base = date ? ROUTES.IDEA_DATE(date) : ROUTES.IDEA; + return safeBox ? `${base}?box=${safeBox}` : base; + }, []); + const extractIdeaBox = useCallback((threadId) => { + if (!threadId) return 'inbox'; + const normalized = threadId.startsWith('.ideas/') ? threadId.slice('.ideas/'.length) : threadId; + const first = normalized.split('/').filter(Boolean)[0] || ''; + if (/^\d{4}$/.test(first)) return 'inbox'; + return first || 'inbox'; + }, []); const openDocFromRef = useCallback((stableId, meta) => { navigate(ROUTES.HOME); openDocByStableId(stableId, meta); @@ -318,16 +353,20 @@ export default function App() { const openIdeaRef = useCallback((ref) => { if (!ref) return; const date = String(ref.date || '').trim(); + const box = extractIdeaBox(ref.threadId || ''); + if (box) { + ideaLoader.setSelectedBox(box); + } if (date) { ideaLoader.setSelectedDate(date); - navigate(ROUTES.IDEA_DATE(date)); + navigate(buildIdeaRoute(box, date)); } else { - navigate(ROUTES.IDEA); + navigate(buildIdeaRoute(box)); } if (ref.entryId) { setIdeaFocusEntryId(ref.entryId); } - }, [ideaLoader, navigate]); + }, [buildIdeaRoute, extractIdeaBox, ideaLoader, navigate]); // 当切换到非编辑器视图时,清除文档选中状态 // 使用 ref 追踪上一次的 view,避免不必要的更新和循环 @@ -349,12 +388,30 @@ export default function App() { } }, [view, params.date]); // eslint-disable-line react-hooks/exhaustive-deps + useEffect(() => { + if (view !== 'idea') return; + if (ideaBoxParam === lastIdeaBoxParamRef.current) return; + lastIdeaBoxParamRef.current = ideaBoxParam; + if (ideaBoxParam && ideaBoxParam !== ideaLoader.selectedBox) { + ideaLoader.setSelectedBox(ideaBoxParam); + } + }, [ideaBoxParam, ideaLoader.selectedBox, ideaLoader.setSelectedBox, view]); + // Sidebar Resize Logic (Same as before) const startResizing = useCallback((e) => { e.preventDefault(); setIsResizingSidebar(true); }, []); const stopResizing = useCallback(() => { setIsResizingSidebar(false); }, []); const resize = useCallback((e) => { if (isResizingSidebar) { const w = e.clientX; if (w > 160 && w < 600) setSidebarWidth(w); } }, [isResizingSidebar]); useEffect(() => { window.addEventListener('mousemove', resize); window.addEventListener('mouseup', stopResizing); return () => { window.removeEventListener('mousemove', resize); window.removeEventListener('mouseup', stopResizing); }; }, [resize, stopResizing]); + const startResizingTerminal = useCallback((e) => { e.preventDefault(); setIsResizingTerminal(true); }, []); + const stopResizingTerminal = useCallback(() => { setIsResizingTerminal(false); }, []); + const resizeTerminal = useCallback((e) => { + if (!isResizingTerminal) return; + const w = window.innerWidth - e.clientX; + if (w > 240 && w < 800) setTerminalWidth(w); + }, [isResizingTerminal]); + useEffect(() => { window.addEventListener('mousemove', resizeTerminal); window.addEventListener('mouseup', stopResizingTerminal); return () => { window.removeEventListener('mousemove', resizeTerminal); window.removeEventListener('mouseup', stopResizingTerminal); }; }, [resizeTerminal, stopResizingTerminal]); + // --- CRUD Handlers --- // Context Menu @@ -388,6 +445,58 @@ export default function App() { }); }; + const handleCreateIdeaBoxAction = () => { + setDialog({ + isOpen: true, + type: 'prompt', + title: t('idea.boxCreateTitle', 'New Ideas Box'), + placeholder: t('idea.boxCreatePlaceholder', 'Box name'), + kind: 'CREATE_IDEA_BOX', + }); + }; + + const handleRenameIdeaBoxAction = (box) => { + if (!box) return; + setDialog({ + isOpen: true, + type: 'prompt', + title: t('idea.boxRenameTitle', 'Rename Ideas Box'), + placeholder: t('idea.boxRenamePlaceholder', 'New name'), + initialValue: box, + kind: 'RENAME_IDEA_BOX', + payload: { box }, + }); + }; + + const handleDeleteIdeaBoxAction = (box) => { + if (!box) return; + setDialog({ + isOpen: true, + type: 'confirm', + title: t('idea.boxDeleteTitle', 'Delete Ideas Box'), + message: t('idea.boxDeleteMessage', { name: box }), + isDestructive: true, + confirmText: t('dialog.deleteItem.confirmText'), + kind: 'DELETE_IDEA_BOX', + payload: { box }, + }); + }; + + const handleMoveIdeaThreadAction = (thread) => { + if (!thread?.threadId) return; + setDialog({ + isOpen: true, + type: 'prompt', + title: t('idea.moveThreadTitle', 'Move thread to box'), + message: t('idea.moveThreadMessage', { name: thread.threadTitle || thread.threadId }), + placeholder: t('idea.moveThreadPlaceholder', 'Target box name'), + initialValue: ideaLoader.selectedBox || '', + confirmText: t('common.move', 'Move'), + kind: 'MOVE_IDEA_THREAD', + payload: { threadId: thread.threadId }, + }); + }; + const handleMoveDocAction = (doc) => { if (!doc?.rel_path) return; const currentDir = dirname(doc.rel_path); @@ -583,6 +692,17 @@ export default function App() { return; } + if (kind === 'CREATE_IDEA_BOX') { + const v = String(value || '').trim(); + if (!v) return; + if (v.includes('/') || v.includes('\\')) { + throw new Error(t('dialog.rename.invalidName') || 'Name cannot contain path separators'); + } + const boxName = await ideaLoader.createBox(v); + navigate(buildIdeaRoute(boxName, ideaLoader.selectedDate)); + return; + } + if (kind === 'MOVE_DOC') { const destFolderPath = String(value || '').trim(); const docRelPath = payload.docRelPath; @@ -664,6 +784,18 @@ export default function App() { return; } + if (kind === 'RENAME_IDEA_BOX') { + const newName = String(value || '').trim(); + if (!newName) return; + if (newName.includes('/') || newName.includes('\\')) { + throw new Error(t('dialog.rename.invalidName') || 'Name cannot contain path separators'); + } + const oldName = payload.box; + const boxName = await ideaLoader.renameBox(oldName, newName); + navigate(buildIdeaRoute(boxName, ideaLoader.selectedDate)); + return; + } + if (kind === 'SET_DESCRIPTION') { const v = String(value || ''); const docRelPath = payload.docRelPath; @@ -680,6 +812,20 @@ export default function App() { if (kind === 'DELETE_ITEM') { await performDelete(payload.item); } + + if (kind === 'DELETE_IDEA_BOX') { + const box = payload.box; + await ideaLoader.deleteBox(box); + navigate(buildIdeaRoute(ideaLoader.selectedBox, ideaLoader.selectedDate)); + return; + } + + if (kind === 'MOVE_IDEA_THREAD') { + const targetBox = String(value || '').trim(); + if (!targetBox) return; + await ideaLoader.moveThread(payload.threadId, targetBox); + return; + } } catch (err) { setDialog({ isOpen: true, type: 'alert', title: t('error.operationFailed'), message: err.message, kind: 'ALERT' }); } @@ -777,7 +923,7 @@ export default function App() { useEffect(() => { if (!selectedDoc || !save.hasPendingChanges || isHydratingContentRef.current) return; if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current); autoSaveTimerRef.current = setTimeout(() => saveDocument('auto'), AUTO_SAVE_DELAY); return () => { if (autoSaveTimerRef.current) clearTimeout(autoSaveTimerRef.current); }; }, [selectedDoc, docContent, save.hasPendingChanges]); return ( -
setContextMenu(null)}> +
setContextMenu(null)}> {foldersLoaded ? ( setIsSearchOpen(true)} onRequestSettings={() => navigate(ROUTES.SETTINGS)} - onRequestIdea={() => navigate(ROUTES.IDEA)} + onRequestIdea={() => navigate(buildIdeaRoute(ideaLoader.selectedBox))} + onRequestCreateIdeaBox={handleCreateIdeaBoxAction} + onRequestRenameIdeaBox={handleRenameIdeaBoxAction} + onRequestDeleteIdeaBox={handleDeleteIdeaBoxAction} ideaLoader={ideaLoader} onCopyFolderCitation={handleCopyFolderCitation} onCopyDocCitation={handleCopyDocCitation} @@ -813,7 +962,7 @@ export default function App() { startResizing={startResizing} /> ) : ( -