diff --git a/.beads/.gitignore b/.beads/.gitignore new file mode 100644 index 00000000..d27a1db5 --- /dev/null +++ b/.beads/.gitignore @@ -0,0 +1,44 @@ +# SQLite databases +*.db +*.db?* +*.db-journal +*.db-wal +*.db-shm + +# Daemon runtime files +daemon.lock +daemon.log +daemon.pid +bd.sock +sync-state.json +last-touched + +# Local version tracking (prevents upgrade notification spam after git ops) +.local_version + +# Legacy database files +db.sqlite +bd.db + +# Worktree redirect file (contains relative path to main repo's .beads/) +# Must not be committed as paths would be wrong in other clones +redirect + +# Merge artifacts (temporary files from 3-way merge) +beads.base.jsonl +beads.base.meta.json +beads.left.jsonl +beads.left.meta.json +beads.right.jsonl +beads.right.meta.json + +# Sync state (local-only, per-machine) +# These files are machine-specific and should not be shared across clones +.sync.lock +sync_base.jsonl + +# NOTE: Do NOT add negation patterns (e.g., !issues.jsonl) here. +# They would override fork protection in .git/info/exclude, allowing +# contributors to accidentally commit upstream issue databases. +# The JSONL files (issues.jsonl, interactions.jsonl) and config files +# are tracked by git by default since no pattern above ignores them. diff --git a/.beads/README.md b/.beads/README.md new file mode 100644 index 00000000..50f281f0 --- /dev/null +++ b/.beads/README.md @@ -0,0 +1,81 @@ +# Beads - AI-Native Issue Tracking + +Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code. + +## What is Beads? + +Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git. + +**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads) + +## Quick Start + +### Essential Commands + +```bash +# Create new issues +bd create "Add user authentication" + +# View all issues +bd list + +# View issue details +bd show + +# Update issue status +bd update --status in_progress +bd update --status done + +# Sync with git remote +bd sync +``` + +### Working with Issues + +Issues in Beads are: +- **Git-native**: Stored in `.beads/issues.jsonl` and synced like code +- **AI-friendly**: CLI-first design works perfectly with AI coding agents +- **Branch-aware**: Issues can follow your branch workflow +- **Always in sync**: Auto-syncs with your commits + +## Why Beads? + +✨ **AI-Native Design** +- Built specifically for AI-assisted development workflows +- CLI-first interface works seamlessly with AI coding agents +- No context switching to web UIs + +πŸš€ **Developer Focused** +- Issues live in your repo, right next to your code +- Works offline, syncs when you push +- Fast, lightweight, and stays out of your way + +πŸ”§ **Git Integration** +- Automatic sync with git commits +- Branch-aware issue tracking +- Intelligent JSONL merge resolution + +## Get Started with Beads + +Try Beads in your own projects: + +```bash +# Install Beads +curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash + +# Initialize in your repo +bd init + +# Create your first issue +bd create "Try out Beads" +``` + +## Learn More + +- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs) +- **Quick Start Guide**: Run `bd quickstart` +- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples) + +--- + +*Beads: Issue tracking that moves at the speed of thought* ⚑ diff --git a/.beads/config.yaml b/.beads/config.yaml new file mode 100644 index 00000000..1de3590e --- /dev/null +++ b/.beads/config.yaml @@ -0,0 +1,62 @@ +# Beads Configuration File +# This file configures default behavior for all bd commands in this repository +# All settings can also be set via environment variables (BD_* prefix) +# or overridden with command-line flags + +# Issue prefix for this repository (used by bd init) +# If not set, bd init will auto-detect from directory name +# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc. +# issue-prefix: "" + +# Use no-db mode: load from JSONL, no SQLite, write back after each command +# When true, bd will use .beads/issues.jsonl as the source of truth +# instead of SQLite database +# no-db: false + +# Disable daemon for RPC communication (forces direct database access) +# no-daemon: false + +# Disable auto-flush of database to JSONL after mutations +# no-auto-flush: false + +# Disable auto-import from JSONL when it's newer than database +# no-auto-import: false + +# Enable JSON output by default +# json: false + +# Default actor for audit trails (overridden by BD_ACTOR or --actor) +# actor: "" + +# Path to database (overridden by BEADS_DB or --db) +# db: "" + +# Auto-start daemon if not running (can also use BEADS_AUTO_START_DAEMON) +# auto-start-daemon: true + +# Debounce interval for auto-flush (can also use BEADS_FLUSH_DEBOUNCE) +# flush-debounce: "5s" + +# Git branch for beads commits (bd sync will commit to this branch) +# IMPORTANT: Set this for team projects so all clones use the same sync branch. +# This setting persists across clones (unlike database config which is gitignored). +# Can also use BEADS_SYNC_BRANCH env var for local override. +# If not set, bd sync will require you to run 'bd config set sync.branch '. +sync-branch: "beads-sync" + +# Multi-repo configuration (experimental - bd-307) +# Allows hydrating from multiple repositories and routing writes to the correct JSONL +# repos: +# primary: "." # Primary repo (where this database lives) +# additional: # Additional repos to hydrate from (read-only) +# - ~/beads-planning # Personal planning repo +# - ~/work-planning # Work planning repo + +# Integration settings (access with 'bd config get/set') +# These are stored in the database, not in this file: +# - jira.url +# - jira.project +# - linear.url +# - linear.api-key +# - github.org +# - github.repo \ No newline at end of file diff --git a/.beads/interactions.jsonl b/.beads/interactions.jsonl new file mode 100644 index 00000000..e69de29b diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl new file mode 100644 index 00000000..bc329be6 --- /dev/null +++ b/.beads/issues.jsonl @@ -0,0 +1 @@ +{"id":"proofkit-137","title":"Fix CLI scaffold missing component files","description":"## CLI Scaffold Missing Component Files\n\n**Test:** `@proofkit/cli` \u003e `browser-apps.test.ts` \u003e 'should create a project with FileMaker integration in CI mode'\n\n**Reproduced locally:** Yes (after deleting stale `packages/tmp/cli-tests/test-fm-project`)\n\n### Missing 3 components:\n1. `src/components/mode-toggle.tsx` - imported by `slot-header-right.tsx:4`\n2. `src/components/ui/sonner.tsx` - imported by `providers.tsx:4`\n3. `src/components/ui/button.tsx` - imported by `page.tsx:11`\n\n### Root cause:\nCLI scaffolding generates code that imports these shadcn/ui-style components but doesn't include the actual component files in the generated project.\n\n### Why it appeared to pass locally before:\nStale `test-fm-project` dir existed from previous runs. Turbo may have cached 'passed' result based on old inputs. Fresh scaffold exposes the missing files.\n\n### Fix needed:\nEnsure CLI registry/templates include all required UI components that generated code imports. Check:\n- `packages/registry/` for component definitions\n- CLI scaffold logic that copies/generates components\n\n### Additional warnings (non-blocking):\n```\nWarning: Invalid input options - For the \"define\". Invalid key: Expected never but received \"define\".\n```\nThis vitest config warning appears twice but doesn't cause failure.","status":"in_progress","priority":2,"issue_type":"bug","created_at":"2026-01-10T13:34:47.060701-06:00","created_by":"ericluce","updated_at":"2026-01-10T13:41:51.749548-06:00"} diff --git a/.beads/metadata.json b/.beads/metadata.json new file mode 100644 index 00000000..c787975e --- /dev/null +++ b/.beads/metadata.json @@ -0,0 +1,4 @@ +{ + "database": "beads.db", + "jsonl_export": "issues.jsonl" +} \ No newline at end of file diff --git a/.changeset/better-auth-type-errors.md b/.changeset/better-auth-type-errors.md new file mode 100644 index 00000000..b78724b0 --- /dev/null +++ b/.changeset/better-auth-type-errors.md @@ -0,0 +1,6 @@ +--- +"@proofkit/better-auth": patch +--- + +Fix TypeScript build errors by making adapter/migration types resilient to upstream Better Auth changes. + diff --git a/.changeset/fix-typegen-auth-detection.md b/.changeset/fix-typegen-auth-detection.md new file mode 100644 index 00000000..49f921d8 --- /dev/null +++ b/.changeset/fix-typegen-auth-detection.md @@ -0,0 +1,5 @@ +--- +"@proofkit/typegen": patch +--- + +Fix generated client authentication type detection to use OttoAdapter when OTTO_API_KEY environment variable is set with default names diff --git a/.changeset/pre.json b/.changeset/pre.json index 0ae8fcfb..700ab161 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -18,9 +18,12 @@ }, "changesets": [ "add-format-command", + "bright-dogs-teach", "brown-keys-float", + "fix-typegen-auth-detection", "get-query-string-entity-ids-override", "happy-rocks-watch", + "lucky-zebras-beam", "olive-coins-trade", "quick-ends-drop", "real-ideas-sort", diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index bc449a57..1316c3a9 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -2,6 +2,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +@AGENTS.md + ## Project Overview ProofKit is a monorepo of TypeScript tools and libraries for building web applications integrated with Claris FileMaker. Documentation: https://proofkit.dev diff --git a/.claude/ai-builder.lock.json b/.claude/ai-builder.lock.json new file mode 100644 index 00000000..e67a4c73 --- /dev/null +++ b/.claude/ai-builder.lock.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "artifacts": { + "skill:openameba/create-changeset": { + "type": "skill", + "slug": "create-changeset", + "author": "openameba", + "name": "create-changeset", + "installedAt": "2026-01-07T14:50:43.613Z", + "files": [".claude/skills/create-changeset/SKILL.md"] + } + } +} diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 00000000..0cbf4db5 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,5 @@ +{ + "enabledPlugins": { + "typescript-lsp@claude-plugins-official": true + } +} diff --git a/.claude/skills/create-changeset/SKILL.md b/.claude/skills/create-changeset/SKILL.md new file mode 100644 index 00000000..67027c64 --- /dev/null +++ b/.claude/skills/create-changeset/SKILL.md @@ -0,0 +1,140 @@ +--- +name: create-changeset +description: Analyze git changes and create changesets for package releases. Use when preparing pull requests, creating PRs, when branch has commits ready for review, or when user mentions changeset or version bump. +--- +# Create Changeset Skill + +## Purpose + +This skill automatically analyzes branch changes and creates appropriate changesets for package releases in this monorepo. It examines git history, determines version bump types based on Conventional Commits, and generates properly formatted changeset files. + +## When to Invoke + +Automatically invoke this skill when: +- User is preparing to create a pull request +- User mentions "PR", "pull request", or "ready for review" +- Branch has commits ready for review +- User explicitly mentions "changeset" or "version bump" + +Do NOT invoke when: +- User is only pushing changes without creating a PR +- Only documentation files have changed (README, .md files) +- Only CI/CD configuration has changed (.github/workflows/) +- Only development tool configuration has changed (eslint, prettier, etc.) +- Commits are only `docs:`, `chore:`, `ci:`, or `test:` types that don't affect packages + +## Pre-execution Validation + +Before creating a changeset, check if a changeset file already exists for the current changes: +- Look for `.changeset/*.md` files (excluding README.md) +- If exists, ask user: "A changeset already exists. Create another one?" + +## Implementation Steps + +### 1. Check Current State + +Execute `git log main..HEAD` (or `origin/main..HEAD`) to check for committed changes on the branch. If no commits exist, exit early without creating a changeset. + +### 2. Analyze Changes + +Use `git diff main...HEAD` (or `origin/main...HEAD`) to analyze **committed changes only**. + +Identify which packages are affected by checking files under `packages/*/`. Review commit messages using `git log main..HEAD --oneline` (or `origin/main..HEAD`). + +### 3. Determine Version Bump Type + +Analyze commit messages following Conventional Commits 1.0.0 format: + +- **major**: Contains `BREAKING CHANGE` in commit body, or breaking changes detected in code + - API signature changes + - Removed exports or features + - Incompatible behavior changes +- **minor**: Starts with `feat:` or `feat(scope):` - new features (backward compatible) + - New components or functionality + - New props or options (with defaults) + - New exports +- **patch**: Starts with `fix:` or `fix(scope):` - bug fixes and minor improvements + - Bug fixes + - Performance improvements + - Minor style updates +- **skip**: Other types (`chore:`, `docs:`, `ci:`, `test:`) typically don't require changesets unless they affect package functionality + +Review actual code changes to confirm the appropriate version bump. **When in doubt between minor and patch, prefer patch for safety.** + +If the version bump is ambiguous or unclear: +- Ask user for clarification +- Explain the reasoning behind the suggested bump type +- Allow user to override the suggestion + +If all commits are types that don't require changesets (`docs:`, `chore:`, `ci:`, `test:`), exit early without creating a changeset. + +### 4. Generate Changeset + +Create a changeset file with a descriptive filename in `.changeset/` directory. + +**Filename format:** +- Use kebab-case with `.md` extension +- Examples: `.changeset/add-new-button.md`, `.changeset/fix-layout-bug.md`, `.changeset/update-icon-props.md` + +**File content format:** +```markdown +--- +"@openameba/package-name": major|minor|patch +--- + +Clear description of the change +``` + +**Example for single package:** +```markdown +--- +"@openameba/spindle-ui": minor +--- + +Add new Button variant for secondary actions +``` + +**Example for multiple packages:** +```markdown +--- +"@openameba/spindle-ui": minor +"@openameba/spindle-tokens": patch +--- + +- spindle-ui: Add new Button variant for secondary actions +- spindle-tokens: Fix color token contrast ratio +``` + +**Important guidelines:** +- The description should be user-friendly as it will appear in CHANGELOG +- **Use the same language as the commit messages** (Japanese or English). If commit messages are mixed, prefer Japanese. +- Split changesets into separate files when the same package has changes with different purposes (e.g., new feature + bug fix, breaking change + internal refactoring) +- This creates individual top-level items in release notes, making it easier for readers to understand the intent of each change +- Example: Create `.changeset/add-secondary-button.md` for a new feature and `.changeset/fix-button-layout.md` for a bug fix, even if both target the same package + +### 5. Lint Changeset + +Execute `pnpm textlint .changeset/.md` to validate the changeset file. + +**Error handling:** +- If linting errors occur, attempt to auto-fix common issues: + - Spacing and punctuation + - Common grammar mistakes +- Re-run textlint after auto-fix +- If errors persist: + - Display error details to user + - Ask user for guidance on how to fix + - Do NOT proceed to commit until lint passes + +### 6. Verify and Commit + +Display the generated changeset for review: +- Show the file path +- Show the file content +- Confirm it accurately reflects the changes + +Once verified, commit the changeset file: +```bash +git add .changeset/.md +git commit -m "chore: add changeset" +``` \ No newline at end of file diff --git a/.cursor/rules/beads.mdc b/.cursor/rules/beads.mdc new file mode 100644 index 00000000..4b1e0173 --- /dev/null +++ b/.cursor/rules/beads.mdc @@ -0,0 +1,38 @@ +# Beads Issue Tracking +# Auto-generated by 'bd setup cursor' - do not remove these markers +# BEGIN BEADS INTEGRATION + +This project uses [Beads (bd)](https://github.com/steveyegge/beads) for issue tracking. + +## Core Rules +- Track ALL work in bd (never use markdown TODOs or comment-based task lists) +- Use `bd ready` to find available work +- Use `bd create` to track new issues/tasks/bugs +- Use `bd sync` at end of session to sync with git remote +- Git hooks auto-sync on commit/merge + +## Quick Reference +```bash +bd prime # Load complete workflow context +bd ready # Show issues ready to work (no blockers) +bd list --status=open # List all open issues +bd create --title="..." --type=task # Create new issue +bd update --status=in_progress # Claim work +bd close # Mark complete +bd dep add # Add dependency (issue depends on depends-on) +bd sync # Sync with git remote +``` + +## Workflow +1. Check for ready work: `bd ready` +2. Claim an issue: `bd update --status=in_progress` +3. Do the work +4. Mark complete: `bd close ` +5. Sync: `bd sync` (or let git hooks handle it) + +## Context Loading +Run `bd prime` to get complete workflow documentation in AI-optimized format (~1-2k tokens). + +For detailed docs: see AGENTS.md, QUICKSTART.md, or run `bd --help` + +# END BEADS INTEGRATION diff --git a/.gitattributes b/.gitattributes index 99915e35..17ccdc8f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,5 @@ # mdx -*.mdx linguist-detectable=false \ No newline at end of file +*.mdx linguist-detectable=false + +# Use bd merge for beads JSONL files +.beads/issues.jsonl merge=beads diff --git a/.github/workflows/continuous-release.yml b/.github/workflows/continuous-release.yml index 023c0516..a8524614 100644 --- a/.github/workflows/continuous-release.yml +++ b/.github/workflows/continuous-release.yml @@ -1,10 +1,79 @@ name: Publish Any Commit -on: [push, pull_request] +on: + push: + branches-ignore: + - beads-sync + pull_request: + branches-ignore: + - beads-sync + +env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ vars.TURBO_TEAM }} jobs: - build: + lint: + if: github.ref != 'refs/heads/beads-sync' + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - run: corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + typecheck: + if: github.ref != 'refs/heads/beads-sync' + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - run: corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Type Check + run: pnpm typecheck + + test: + if: github.ref != 'refs/heads/beads-sync' runs-on: ubuntu-latest + needs: [lint, typecheck] + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - run: corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run Unit Tests + run: pnpm test + build: + if: github.ref != 'refs/heads/beads-sync' + runs-on: ubuntu-latest + needs: [test] steps: - name: Checkout code uses: actions/checkout@v4 @@ -20,4 +89,5 @@ jobs: - name: Build run: pnpm build + - run: pnpm dlx pkg-pr-new publish './packages/*' --packageManager=pnpm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3964579a..0ae71e39 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,21 +1,75 @@ name: Release on: + workflow_dispatch: + push: branches: - main concurrency: ${{ github.workflow }}-${{ github.ref }} +env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ vars.TURBO_TEAM }} + permissions: - # Changesets/action needs to push version commits and open/update a PR contents: write pull-requests: write - id-token: write # Required for OIDC + id-token: write jobs: + quality: + if: github.ref != 'refs/heads/beads-sync' + name: Quality Checks + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + + - name: Enable Corepack + run: corepack enable + + - name: Setup Node.js 22.x + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "pnpm" + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + - name: Type Check + run: pnpm typecheck + + - name: Install Doppler CLI + uses: dopplerhq/cli-action@v3 + + - name: Get OIDC token + run: | + TOKEN=$(curl -s -H "Authorization: Bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \ + "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=https://github.com/$GITHUB_REPOSITORY_OWNER") + echo "OIDC_TOKEN=$(echo $TOKEN | jq -r '.value')" >> $GITHUB_ENV + + - name: Authenticate with Doppler + run: | + doppler oidc login --scope=. --identity=${{ vars.DOPPLER_SERVICE_IDENTITY_ID }} --token=$OIDC_TOKEN + doppler configure set project proofkit + doppler configure set config test + + - name: Run Tests + run: pnpm test + + - name: Run fmodata E2E Tests + run: pnpm --filter @proofkit/fmodata test:e2e + release: + if: github.ref != 'refs/heads/beads-sync' name: Release + needs: [quality] runs-on: ubuntu-latest steps: - name: Checkout Repo @@ -38,9 +92,7 @@ jobs: id: changesets uses: changesets/action@v1 with: - # This expects you to have a script called release which does a build for your packages and calls changeset publish publish: pnpm release env: GITHUB_TOKEN: ${{ github.token }} - NODE_AUTH_TOKEN: ${{ secrets.NPM_ACCESS_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/.gitignore b/.gitignore index e01afaf6..3f02c647 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ packages/typegen/schema/metadata.xml # Prevent accidentally committing files with absolute paths Users/ + +# bv (beads viewer) local config and caches +.bv/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..ffadc499 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,192 @@ +# Agent Instructions + +This project uses **bd** (beads) for issue tracking. Run `bd onboard` to get started. + +## Quick Reference + +```bash +bd ready # Find available work +bd show # View issue details +bd update --status in_progress # Claim work +bd close # Complete work +bd sync # Sync with git +``` + +## Landing the Plane (Session Completion) + +**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds. + +**MANDATORY WORKFLOW:** + +1. **File issues for remaining work** - Create issues for anything that needs follow-up +2. **Run quality gates** (if code changed) - Tests, linters, builds +3. **Update issue status** - Close finished work, update in-progress items +4. **PUSH TO REMOTE** - This is MANDATORY: + ```bash + git pull --rebase + bd sync + git push + git status # MUST show "up to date with origin" + ``` +5. **Clean up** - Clear stashes, prune remote branches +6. **Verify** - All changes committed AND pushed +7. **Hand off** - Provide context for next session + +**CRITICAL RULES:** +- Work is NOT complete until `git push` succeeds +- NEVER stop before pushing - that leaves work stranded locally +- NEVER say "ready to push when you are" - YOU must push +- If push fails, resolve and retry until it succeeds + + + + +--- + +## Beads Workflow Integration + +This project uses [beads_viewer](https://github.com/Dicklesworthstone/beads_viewer) for issue tracking. Issues are stored in `.beads/` and tracked in git. + +### Essential Commands + +```bash +# View issues (launches TUI - avoid in automated sessions) +bv + +# CLI commands for agents (use these instead) +bd ready # Show issues ready to work (no blockers) +bd list --status=open # All open issues +bd show # Full issue details with dependencies +bd create --title="..." --type=task --priority=2 +bd update --status=in_progress +bd close --reason="Completed" +bd close # Close multiple issues at once +bd sync # Commit and push changes +``` + +### Workflow Pattern + +1. **Start**: Run `bd ready` to find actionable work +2. **Claim**: Use `bd update --status=in_progress` +3. **Work**: Implement the task +4. **Complete**: Use `bd close ` +5. **Sync**: Always run `bd sync` at session end + +### Key Concepts + +- **Dependencies**: Issues can block other issues. `bd ready` shows only unblocked work. +- **Priority**: P0=critical, P1=high, P2=medium, P3=low, P4=backlog (use numbers, not words) +- **Types**: task, bug, feature, epic, question, docs +- **Blocking**: `bd dep add ` to add dependencies + +### Session Protocol + +**Before ending any session, run this checklist:** + +```bash +git status # Check what changed +git add # Stage code changes +bd sync # Commit beads changes +git commit -m "..." # Commit code +bd sync # Commit any new beads changes +git push # Push to remote +``` + +### Best Practices + +- Check `bd ready` at session start to find available work +- Update status as you work (in_progress β†’ closed) +- Create new issues with `bd create` when you discover tasks +- Use descriptive titles and set appropriate priority/type +- Always `bd sync` before ending session + + + + +### Using bv as an AI sidecar + +bv is a graph-aware triage engine for Beads projects (.beads/beads.jsonl). Instead of parsing JSONL or hallucinating graph traversal, use robot flags for deterministic, dependency-aware outputs with precomputed metrics (PageRank, betweenness, critical path, cycles, HITS, eigenvector, k-core). + +**Scope boundary:** bv handles *what to work on* (triage, priority, planning). For agent-to-agent coordination (messaging, work claiming, file reservations), use [MCP Agent Mail](https://github.com/Dicklesworthstone/mcp_agent_mail). + +**⚠️ CRITICAL: Use ONLY `--robot-*` flags. Bare `bv` launches an interactive TUI that blocks your session.** + +#### The Workflow: Start With Triage + +**`bv --robot-triage` is your single entry point.** It returns everything you need in one call: +- `quick_ref`: at-a-glance counts + top 3 picks +- `recommendations`: ranked actionable items with scores, reasons, unblock info +- `quick_wins`: low-effort high-impact items +- `blockers_to_clear`: items that unblock the most downstream work +- `project_health`: status/type/priority distributions, graph metrics +- `commands`: copy-paste shell commands for next steps + +bv --robot-triage # THE MEGA-COMMAND: start here +bv --robot-next # Minimal: just the single top pick + claim command + +#### Other Commands + +**Planning:** +| Command | Returns | +|---------|---------| +| `--robot-plan` | Parallel execution tracks with `unblocks` lists | +| `--robot-priority` | Priority misalignment detection with confidence | + +**Graph Analysis:** +| Command | Returns | +|---------|---------| +| `--robot-insights` | Full metrics: PageRank, betweenness, HITS (hubs/authorities), eigenvector, critical path, cycles, k-core, articulation points, slack | +| `--robot-label-health` | Per-label health: `health_level` (healthy\|warning\|critical), `velocity_score`, `staleness`, `blocked_count` | +| `--robot-label-flow` | Cross-label dependency: `flow_matrix`, `dependencies`, `bottleneck_labels` | +| `--robot-label-attention [--attention-limit=N]` | Attention-ranked labels by: (pagerank Γ— staleness Γ— block_impact) / velocity | + +**History & Change Tracking:** +| Command | Returns | +|---------|---------| +| `--robot-history` | Bead-to-commit correlations: `stats`, `histories` (per-bead events/commits/milestones), `commit_index` | +| `--robot-diff --diff-since ` | Changes since ref: new/closed/modified issues, cycles introduced/resolved | + +**Other Commands:** +| Command | Returns | +|---------|---------| +| `--robot-burndown ` | Sprint burndown, scope changes, at-risk items | +| `--robot-forecast ` | ETA predictions with dependency-aware scheduling | +| `--robot-alerts` | Stale issues, blocking cascades, priority mismatches | +| `--robot-suggest` | Hygiene: duplicates, missing deps, label suggestions, cycle breaks | +| `--robot-graph [--graph-format=json\|dot\|mermaid]` | Dependency graph export | +| `--export-graph ` | Self-contained interactive HTML visualization | + +#### Scoping & Filtering + +bv --robot-plan --label backend # Scope to label's subgraph +bv --robot-insights --as-of HEAD~30 # Historical point-in-time +bv --recipe actionable --robot-plan # Pre-filter: ready to work (no blockers) +bv --recipe high-impact --robot-triage # Pre-filter: top PageRank scores +bv --robot-triage --robot-triage-by-track # Group by parallel work streams +bv --robot-triage --robot-triage-by-label # Group by domain + +#### Understanding Robot Output + +**All robot JSON includes:** +- `data_hash` β€” Fingerprint of source beads.jsonl (verify consistency across calls) +- `status` β€” Per-metric state: `computed|approx|timeout|skipped` + elapsed ms +- `as_of` / `as_of_commit` β€” Present when using `--as-of`; contains ref and resolved SHA + +**Two-phase analysis:** +- **Phase 1 (instant):** degree, topo sort, density β€” always available immediately +- **Phase 2 (async, 500ms timeout):** PageRank, betweenness, HITS, eigenvector, cycles β€” check `status` flags + +**For large graphs (>500 nodes):** Some metrics may be approximated or skipped. Always check `status`. + +#### jq Quick Reference + +bv --robot-triage | jq '.quick_ref' # At-a-glance summary +bv --robot-triage | jq '.recommendations[0]' # Top recommendation +bv --robot-plan | jq '.plan.summary.highest_impact' # Best unblock target +bv --robot-insights | jq '.status' # Check metric readiness +bv --robot-insights | jq '.Cycles' # Circular deps (must fix!) +bv --robot-label-health | jq '.results.labels[] | select(.health_level == "critical")' + +**Performance:** Phase 1 instant, Phase 2 async (500ms timeout). Prefer `--robot-plan` over `--robot-insights` when speed matters. Results cached by data hash. + +Use bv instead of parsing beads.jsonlβ€”it computes PageRank, critical paths, cycles, and parallel tracks deterministically. \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..bca0681e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,72 @@ +# Contributing to ProofKit + +## Getting Started + +### Prerequisites + +- Node.js >= 18 +- pnpm (managed via corepack) +- [Doppler CLI](https://docs.doppler.com/docs/install-cli) for secrets management + +### Setup + +1. Clone the repository and install dependencies: + +```bash +git clone https://github.com/proofgeist/proofkit.git +cd proofkit +corepack enable +pnpm install +``` + +2. Install and configure Doppler: + +```bash +# Install Doppler CLI +brew install dopplerhq/cli/doppler # macOS +# or: curl -Ls https://cli.doppler.com/install.sh | sh # Linux + +# Login to Doppler +doppler login + +# Setup project (select proofkit project, dev config) +doppler setup +``` + +### Running Tests + +Test scripts automatically use `doppler run` to inject secrets: + +```bash +# Run all tests +pnpm test + +# Run specific package tests +pnpm --filter @proofkit/fmodata test +pnpm --filter @proofkit/fmodata test:e2e +``` + +### Building + +```bash +pnpm build +``` + +### Linting and Formatting + +```bash +pnpm lint +pnpm format +``` + +## Development Workflow + +1. Create a new branch for your feature or fix +2. Make your changes +3. Run tests with `pnpm test:local` +4. Run `pnpm lint` to check for issues +5. Submit a pull request + +## Code Style + +This project uses [Ultracite](https://github.com/proofgeist/ultracite) for linting and formatting. Run `pnpm dlx ultracite fix` to auto-fix issues before committing. diff --git a/apps/docs/content/docs/better-auth/installation.mdx b/apps/docs/content/docs/better-auth/installation.mdx index fa078ff6..691cc3e0 100644 --- a/apps/docs/content/docs/better-auth/installation.mdx +++ b/apps/docs/content/docs/better-auth/installation.mdx @@ -5,6 +5,7 @@ title: Installation & Usage import { Callout } from "fumadocs-ui/components/callout"; import { CliCommand } from "@/components/CliCommand"; +import { PackageInstall } from "@/components/PackageInstall"; @@ -31,9 +32,7 @@ Follow the [Better-Auth installation guide](https://better-auth.com/docs/install ### Database Setup Ensure you have the @proofkit/better-auth package installed in your app. -```package-install -@proofkit/better-auth -``` + Configure your database connection in your `auth.ts` file. Be sure to set these value secrets in your environment variables. The credentials you use here need `fmodata` permissions enabled, and read/write access to the better-auth tables. ```ts title="auth.ts" @@ -62,10 +61,10 @@ export const auth = betterAuth({ # Step 2: Create/Update Database Tables Run the following command to create the necessary tables and fields in your FileMaker file. It will show you a confirmation before any changes are applied, so you can review them. - + [Full Access] credentials are required for the schema changes to be applied automatically, but you may want to use a more restricted account for the rest of better-auth usage. If your credentials that you entered earlier in the `auth.ts` file do not have the [Full Access] permissions, you can override them in the CLI. - + These changes affect database schema only. No layouts or relationships are created or modified during this process. diff --git a/apps/docs/content/docs/better-auth/troubleshooting.mdx b/apps/docs/content/docs/better-auth/troubleshooting.mdx index 16e575f1..eec44cd1 100644 --- a/apps/docs/content/docs/better-auth/troubleshooting.mdx +++ b/apps/docs/content/docs/better-auth/troubleshooting.mdx @@ -2,6 +2,8 @@ title: Troubleshooting --- +import { CliCommand } from "@/components/CliCommand"; + ## Error when generating schema ```bash ERROR [Better Auth]: filemaker is not supported. If it is a custom adapter, please request the maintainer to implement createSchema @@ -9,6 +11,4 @@ ERROR [Better Auth]: filemaker is not supported. If it is a custom adapter, plea This means you used the better-auth CLI directly instead of the @proofkit/better-auth version. Run this instead: -```bash -pnpm dlx @proofkit/better-auth@latest migrate -``` \ No newline at end of file + \ No newline at end of file diff --git a/apps/docs/content/docs/fmodata/quick-start.mdx b/apps/docs/content/docs/fmodata/quick-start.mdx index dc01ab02..a42aaab9 100644 --- a/apps/docs/content/docs/fmodata/quick-start.mdx +++ b/apps/docs/content/docs/fmodata/quick-start.mdx @@ -12,6 +12,7 @@ import { import { Callout } from "fumadocs-ui/components/callout"; import { Card } from "fumadocs-ui/components/card"; import { CliCommand } from "@/components/CliCommand"; +import { PackageInstall } from "@/components/PackageInstall"; import { Badge } from "@/components/ui/badge"; Here's a minimal example to get you started with `@proofkit/fmodata`: @@ -20,9 +21,7 @@ Here's a minimal example to get you started with `@proofkit/fmodata`: ### Install the package - ```package-install - @proofkit/fmodata - ``` + @@ -34,7 +33,7 @@ Here's a minimal example to get you started with `@proofkit/fmodata`: ```typescript title="connection.ts" tab="Username/Password" import { FMServerConnection } from "@proofkit/fmodata"; - const connection = new FMServerConnection({ + export const connection = new FMServerConnection({ serverUrl: process.env.FM_SERVER, auth: { username: process.env.FM_USERNAME, @@ -46,7 +45,7 @@ Here's a minimal example to get you started with `@proofkit/fmodata`: ```typescript title="connection.ts" tab="API key" import { FMServerConnection } from "@proofkit/fmodata"; - const connection = new FMServerConnection({ + export const connection = new FMServerConnection({ serverUrl: process.env.FM_SERVER, auth: { apiKey: process.env.OTTO_API_KEY, @@ -67,7 +66,7 @@ Here's a minimal example to get you started with `@proofkit/fmodata`: Run this command in your project to launch a browser-based UI for configuring your schema definitions. You will need environment variables set for your FileMaker server and database. - + Learn more about the [@proofkit/typegen](/docs/typegen) tool. diff --git a/apps/docs/content/docs/typegen/index.mdx b/apps/docs/content/docs/typegen/index.mdx index 81c5f4b0..168d85aa 100644 --- a/apps/docs/content/docs/typegen/index.mdx +++ b/apps/docs/content/docs/typegen/index.mdx @@ -7,6 +7,7 @@ import { Tabs, TabItem } from "fumadocs-ui/components/tabs"; import { Callout } from "fumadocs-ui/components/callout"; import { File, Folder, Files } from "fumadocs-ui/components/files"; import { IconFileTypeTs } from "@tabler/icons-react"; +import { CliCommand } from "@/components/CliCommand"; A utility for generating runtime validators and TypeScript files from your own FileMaker layouts. @@ -15,13 +16,7 @@ own FileMaker layouts. Run this command to initialize `@proofkit/typegen` in your project: -```bash tab="pnpm" -pnpm dlx @proofkit/typegen@latest -``` - -```bash tab="npm" -npx @proofkit/typegen@latest -``` + ## Configuring Typegen @@ -51,14 +46,7 @@ If you need to use different env variable names (i.e. for multiple FileMaker con ## Running Typegen Once you have a config file setup, you can run the command to generate the types: - -```bash tab="pnpm" -pnpm dlx @proofkit/typegen@latest -``` - -```bash tab="npm" -npx @proofkit/typegen@latest -``` + We suggest adding a script to your `package.json` to run this command more easily diff --git a/apps/docs/content/docs/typegen/ui.mdx b/apps/docs/content/docs/typegen/ui.mdx index 20ae4b14..99736135 100644 --- a/apps/docs/content/docs/typegen/ui.mdx +++ b/apps/docs/content/docs/typegen/ui.mdx @@ -2,13 +2,13 @@ title: Typegen UI --- +import { CliCommand } from "@/components/CliCommand"; + The typegen tool has a built-in web interface for editing your JSON config file and running the typegen scripts. It's helpful for making sure your environment variables are setup correctly and can help autocomplete layout/field/table names into the config file. To launch the UI, run the following command and a browser window will open at `http://localhost:3141`: -```bash -npx @proofkit/typegen@latest ui -``` + ## CLI options diff --git a/apps/docs/package.json b/apps/docs/package.json index e36f349e..36bc5b63 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -21,9 +21,9 @@ "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-presence": "^1.1.5", "@radix-ui/react-scroll-area": "^1.2.10", - "@radix-ui/react-separator": "^1.1.7", - "@radix-ui/react-slot": "^1.2.3", - "@tabler/icons-react": "^3.34.1", + "@radix-ui/react-separator": "^1.1.8", + "@radix-ui/react-slot": "^1.2.4", + "@tabler/icons-react": "^3.36.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "fumadocs-core": "16.4.4", @@ -31,7 +31,7 @@ "fumadocs-twoslash": "^3.1.12", "fumadocs-typescript": "^5.0.1", "fumadocs-ui": "16.4.4", - "hono": "^4.9.0", + "hono": "^4.11.3", "jiti": "^1.21.7", "lucide-react": "^0.511.0", "next": "16.1.1", @@ -39,25 +39,25 @@ "react": "19.2.3", "react-dom": "19.2.3", "shadcn": "^2.10.0", - "shiki": "^3.13.0", - "tailwind-merge": "^3.3.1", + "shiki": "3.13.0", + "tailwind-merge": "^3.4.0", "ts-morph": "^26.0.0", - "twoslash": "^0.3.4", - "zod": "^4.2.0" + "twoslash": "^0.3.6", + "zod": "^4.3.5" }, "devDependencies": { "@proofkit/fmdapi": "workspace:*", - "@tailwindcss/postcss": "^4.1.11", + "@tailwindcss/postcss": "^4.1.18", "@types/jest": "^29.5.14", "@types/mdx": "^2.0.13", - "@types/node": "^22.17.1", + "@types/node": "^22.19.5", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", - "happy-dom": "^15.11.7", + "happy-dom": "^20.1.0", "postcss": "^8.5.6", - "tailwindcss": "^4.1.11", - "tw-animate-css": "^1.3.6", + "tailwindcss": "^4.1.18", + "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vitest": "^4.0.7" + "vitest": "^4.0.17" } } diff --git a/apps/docs/src/components/CliCommand.tsx b/apps/docs/src/components/CliCommand.tsx index 40eea400..90c96128 100644 --- a/apps/docs/src/components/CliCommand.tsx +++ b/apps/docs/src/components/CliCommand.tsx @@ -33,18 +33,22 @@ const MANAGERS = [ export function CliCommand({ command, exec, - execPackage = `@proofkit/cli@${cliVersion}`, + execPackage, + packageName = "@proofkit/cli", }: { command: string; exec?: boolean; + /** @deprecated Use packageName instead */ execPackage?: string; + packageName?: string; }) { + const pkg = execPackage ?? `${packageName}@${cliVersion}`; return ( m.label)} persist> {MANAGERS.map((manager) => ( diff --git a/apps/docs/src/components/PackageInstall.tsx b/apps/docs/src/components/PackageInstall.tsx new file mode 100644 index 00000000..a72401f0 --- /dev/null +++ b/apps/docs/src/components/PackageInstall.tsx @@ -0,0 +1,43 @@ +"use client"; +import { DynamicCodeBlock } from "fumadocs-ui/components/dynamic-codeblock"; +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; +import { cliVersion } from "@/lib/constants"; + +const MANAGERS = [ + { key: "npm", label: "npm", prefix: "npm install" }, + { key: "pnpm", label: "pnpm", prefix: "pnpm add" }, + { key: "yarn", label: "yarn", prefix: "yarn add" }, + { key: "bun", label: "bun", prefix: "bun add" }, +]; + +const WHITESPACE_RE = /\s+/; + +/** + * Renders a tabbed package install command. + * Automatically appends @{cliVersion} to @proofkit/* packages unless version is already specified. + */ +export function PackageInstall({ packages }: { packages: string }) { + const pkgs = packages + .trim() + .split(WHITESPACE_RE) + .map((pkg) => { + // If it's a @proofkit package without a version, append the cliVersion + if (pkg.startsWith("@proofkit/") && !pkg.includes("@", 1)) { + return `${pkg}@${cliVersion}`; + } + return pkg; + }) + .join(" "); + + return ( + m.label)} persist> + {MANAGERS.map((manager) => ( + + + + ))} + + ); +} + +export default PackageInstall; diff --git a/doppler.yaml b/doppler.yaml new file mode 100644 index 00000000..b5162c45 --- /dev/null +++ b/doppler.yaml @@ -0,0 +1,3 @@ +setup: + project: proofkit + config: test diff --git a/package.json b/package.json index 1405e352..1bbdf226 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,10 @@ "private": true, "scripts": { "build": "turbo run build --filter={./packages/*} --filter=@proofkit/docs", + "ci": "turbo run lint && turbo run typecheck && turbo run test", "dev": "turbo run dev", "lint": "turbo run lint", + "typecheck": "turbo run typecheck", "clean": "turbo run clean && rm -rf node_modules", "format": "biome format --write .", "changeset": "changeset", @@ -11,23 +13,24 @@ "sherif": "pnpm dlx sherif@latest", "sherif:fix": "pnpm sherif --fix", "release": "turbo run build --filter={./packages/*} && changeset publish", - "test": "vitest", + "test": "turbo run test", + "test:e2e": "turbo run test:e2e", "knip": "knip", "prepare": "husky" }, "devDependencies": { "@biomejs/biome": "2.3.11", - "@changesets/cli": "^2.29.3", - "@types/node": "^22.17.1", + "@changesets/cli": "^2.29.8", + "@types/node": "^22.19.5", "husky": "^9.1.7", - "knip": "^5.56.0", + "knip": "^5.80.2", "lint-staged": "^16.2.7", - "turbo": "^2.5.4", + "turbo": "^2.7.4", "typescript": "^5.9.3", "ultracite": "7.0.8", - "vitest": "^4.0.7" + "vitest": "^4.0.17" }, - "packageManager": "pnpm@10.14.0", + "packageManager": "pnpm@10.27.0", "engines": { "node": ">=18" }, @@ -40,7 +43,13 @@ "pnpm": { "overrides": { "shiki": "3.13.0", - "@shikijs/types": "3.13.0" + "@shikijs/types": "3.13.0", + "glob": "^11.1.0", + "@modelcontextprotocol/sdk": "^1.25.2", + "preact": "^10.26.10", + "qs": "^6.14.1", + "vite": "^6.4.1", + "body-parser": "^2.2.1" } } } diff --git a/packages/better-auth/package.json b/packages/better-auth/package.json index e990acd1..da5a79fc 100644 --- a/packages/better-auth/package.json +++ b/packages/better-auth/package.json @@ -7,6 +7,8 @@ "scripts": { "dev": "pnpm build:watch", "test": "vitest run", + "test:e2e": "doppler run -c test_betterauth -- vitest run tests/e2e", + "typecheck": "tsc --noEmit", "build": "vite build && publint --strict", "build:watch": "vite build --watch", "ci": "pnpm run build && pnpm run test", @@ -46,29 +48,29 @@ "url": "git+https://github.com/proofgeist/proofkit.git" }, "dependencies": { - "@babel/preset-react": "^7.27.1", - "@babel/preset-typescript": "^7.27.1", + "@babel/preset-react": "^7.28.5", + "@babel/preset-typescript": "^7.28.5", "@commander-js/extra-typings": "^14.0.0", - "@tanstack/vite-config": "^0.2.0", - "better-auth": "^1.2.10", - "c12": "^3.0.4", + "@tanstack/vite-config": "^0.2.1", + "better-auth": "^1.4.11", + "c12": "^3.3.3", "chalk": "5.4.1", - "commander": "^14.0.0", - "dotenv": "^16.5.0", - "fs-extra": "^11.3.0", + "commander": "^14.0.2", + "dotenv": "^16.6.1", + "fs-extra": "^11.3.3", "neverthrow": "^8.2.0", - "odata-query": "^8.0.4", + "odata-query": "^8.0.7", "prompts": "^2.4.2", - "vite": "^6.3.4", - "zod": "^4.2.0" + "vite": "^6.4.1", + "zod": "^4.3.5" }, "devDependencies": { "@types/fs-extra": "^11.0.4", "@types/prompts": "^2.4.9", "@vitest/ui": "^3.2.4", - "fm-odata-client": "^3.0.1", + "fm-odata-client": "^3.0.2", "publint": "^0.3.16", "typescript": "^5.9.3", - "vitest": "^4.0.7" + "vitest": "^4.0.17" } } diff --git a/packages/better-auth/src/adapter.ts b/packages/better-auth/src/adapter.ts index da89e72b..701f3cb3 100644 --- a/packages/better-auth/src/adapter.ts +++ b/packages/better-auth/src/adapter.ts @@ -1,6 +1,6 @@ /** biome-ignore-all lint/suspicious/noExplicitAny: library code */ import { logger } from "better-auth"; -import { type AdapterDebugLogs, type CleanedWhere, createAdapter } from "better-auth/adapters"; +import { type CleanedWhere, createAdapter, type DBAdapterDebugLogOption } from "better-auth/adapters"; import buildQuery from "odata-query"; import { prettifyError, z } from "zod/v4"; import { createRawFetch, type FmOdataConfig } from "./odata"; @@ -15,11 +15,11 @@ const configSchema = z.object({ }), }); -interface FileMakerAdapterConfig { +export interface FileMakerAdapterConfig { /** * Helps you debug issues with the adapter. */ - debugLogs?: AdapterDebugLogs; + debugLogs?: DBAdapterDebugLogOption; /** * If the table names in the schema are plural. */ @@ -168,7 +168,7 @@ export const FileMakerAdapter = (_config: FileMakerAdapterConfig = defaultConfig logging: config.debugLogs ? "verbose" : "none", }); - return createAdapter({ + const adapterFactory = createAdapter({ config: { adapterId: "filemaker", adapterName: "FileMaker", @@ -382,4 +382,8 @@ export const FileMakerAdapter = (_config: FileMakerAdapterConfig = defaultConfig }; }, }); + + // Expose the FileMaker config for CLI access + (adapterFactory as any).filemakerConfig = config as FileMakerAdapterConfig; + return adapterFactory; }; diff --git a/packages/better-auth/src/cli/index.ts b/packages/better-auth/src/cli/index.ts index 6d2d53fe..f72f9662 100644 --- a/packages/better-auth/src/cli/index.ts +++ b/packages/better-auth/src/cli/index.ts @@ -1,11 +1,11 @@ #!/usr/bin/env node --no-warnings import { Command } from "@commander-js/extra-typings"; import { logger } from "better-auth"; -import { getAdapter, getAuthTables } from "better-auth/db"; +import { getAdapter, getSchema } from "better-auth/db"; import chalk from "chalk"; import fs from "fs-extra"; import prompts from "prompts"; -import type { AdapterOptions } from "../adapter"; +import type { FileMakerAdapterConfig } from "../adapter"; import { getConfig } from "../better-auth-cli/utils/get-config"; import { executeMigration, planMigration, prettyPrintMigrationPlan } from "../migrate"; import { createRawFetch } from "../odata"; @@ -50,9 +50,9 @@ async function main() { return; } - const betterAuthSchema = getAuthTables(config); + const betterAuthSchema = getSchema(config); - const adapterConfig = (adapter.options as AdapterOptions).config; + const adapterConfig = (adapter as unknown as { filemakerConfig: FileMakerAdapterConfig }).filemakerConfig; const { fetch } = createRawFetch({ ...adapterConfig.odata, auth: diff --git a/packages/better-auth/src/migrate.ts b/packages/better-auth/src/migrate.ts index a9bc94fe..6f022b0b 100644 --- a/packages/better-auth/src/migrate.ts +++ b/packages/better-auth/src/migrate.ts @@ -1,9 +1,22 @@ -import type { BetterAuthDbSchema } from "better-auth/db"; +import type { DBFieldAttribute } from "better-auth/db"; import chalk from "chalk"; import type { Metadata } from "fm-odata-client"; import z from "zod/v4"; import type { createRawFetch } from "./odata"; +/** Schema type returned by better-auth's getSchema function */ +type BetterAuthSchema = Record; order: number }>; + +function normalizeBetterAuthFieldType(fieldType: unknown): string { + if (typeof fieldType === "string") { + return fieldType; + } + if (Array.isArray(fieldType)) { + return fieldType.map(String).join("|"); + } + return String(fieldType); +} + export async function getMetadata(fetch: ReturnType["fetch"], databaseName: string) { console.log("getting metadata..."); const result = await fetch("/$metadata", { @@ -28,7 +41,7 @@ export async function getMetadata(fetch: ReturnType["fetc export async function planMigration( fetch: ReturnType["fetch"], - betterAuthSchema: BetterAuthDbSchema, + betterAuthSchema: BetterAuthSchema, databaseName: string, ): Promise { const metadata = await getMetadata(fetch, databaseName); @@ -86,17 +99,21 @@ export async function planMigration( .sort((a, b) => (a[1].order ?? 0) - (b[1].order ?? 0)) .map(([key, value]) => ({ ...value, - keyName: key, + modelName: key, // Use the key as modelName since getSchema uses table names as keys })); const migrationPlan: MigrationPlan = []; for (const baTable of baTables) { const fields: FmField[] = Object.entries(baTable.fields).map(([key, field]) => { + // Better Auth's FieldType can be a string literal union or arrays. + // Normalize it to a string so our FM mapping logic remains stable. + // Use .includes() for all checks to handle array types like ["boolean", "null"] β†’ "boolean|null" + const t = normalizeBetterAuthFieldType(field.type); let type: "varchar" | "numeric" | "timestamp" = "varchar"; - if (field.type === "boolean" || field.type.includes("number")) { + if (t.includes("boolean") || t.includes("number")) { type = "numeric"; - } else if (field.type === "date") { + } else if (t.includes("date")) { type = "timestamp"; } return { diff --git a/packages/better-auth/tests/adapter.test.ts b/packages/better-auth/tests/adapter.test.ts index 26a58fdd..0f803ffb 100644 --- a/packages/better-auth/tests/adapter.test.ts +++ b/packages/better-auth/tests/adapter.test.ts @@ -1,156 +1,306 @@ -import { runAdapterTest } from "better-auth/adapters/test"; -import { beforeAll, describe, expect, it } from "vitest"; -import { z } from "zod/v4"; -import { FileMakerAdapter } from "../src"; -import { createRawFetch } from "../src/odata"; - -if (!process.env.FM_SERVER) { - throw new Error("FM_SERVER is not set"); -} -if (!process.env.FM_DATABASE) { - throw new Error("FM_DATABASE is not set"); -} -if (!process.env.FM_USERNAME) { - throw new Error("FM_USERNAME is not set"); -} -if (!process.env.FM_PASSWORD) { - throw new Error("FM_PASSWORD is not set"); -} - -const { fetch } = createRawFetch({ - serverUrl: process.env.FM_SERVER, - auth: { - username: process.env.FM_USERNAME, - password: process.env.FM_PASSWORD, - }, - database: process.env.FM_DATABASE, - logging: "verbose", // Enable verbose logging to see the response details -}); +/** + * Unit tests for FileMaker adapter operations using mocked responses. + * These tests verify adapter behavior without requiring a live FileMaker server. + */ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { FileMakerAdapter } from "../src/adapter"; +import { mockResponses } from "./fixtures/responses"; +import { createMockFetch, createMockFetchSequence } from "./utils/mock-fetch"; -describe("My Adapter Tests", async () => { - beforeAll(async () => { - // reset the database - for (const table of ["user", "session", "account", "verification"]) { - const result = await fetch(`/${table}`, { - output: z.object({ value: z.array(z.any()) }), - }); - - if (result.error) { - console.log("Error fetching records:", result.error); - continue; - } - - const records = result.data?.value || []; - for (const record of records) { - const deleteResult = await fetch(`/${table}('${record.id}')`, { - method: "DELETE", - }); - - if (deleteResult.error) { - console.log(`Error deleting record ${record.id}:`, deleteResult.error); - } - } - } - }); - - if (!process.env.FM_SERVER) { - throw new Error("FM_SERVER is not set"); - } - if (!process.env.FM_DATABASE) { - throw new Error("FM_DATABASE is not set"); - } - if (!process.env.FM_USERNAME) { - throw new Error("FM_USERNAME is not set"); - } - if (!process.env.FM_PASSWORD) { - throw new Error("FM_PASSWORD is not set"); - } - - const adapter = FileMakerAdapter({ - debugLogs: { - isRunningAdapterTests: true, // This is our super secret flag to let us know to only log debug logs if a test fails. - }, +// Test adapter factory - creates adapter with test config +function createTestAdapter() { + return FileMakerAdapter({ odata: { - auth: { - username: process.env.FM_USERNAME, - password: process.env.FM_PASSWORD, - }, - database: process.env.FM_DATABASE, - serverUrl: process.env.FM_SERVER, + serverUrl: "https://api.example.com", + auth: { apiKey: "test-api-key" }, + database: "test.fmp12", }, + debugLogs: false, }); +} - await runAdapterTest({ - // biome-ignore lint/suspicious/useAwait: must be an async function - getAdapter: async (betterAuthOptions = {}) => { - return adapter(betterAuthOptions); - }, +describe("FileMakerAdapter", () => { + afterEach(() => { + vi.unstubAllGlobals(); }); - it("should sort descending", async () => { - const result = await adapter({}).findMany({ - model: "verification", - where: [ - { - field: "identifier", - operator: "eq", - value: "zyzaUHEsETWiuORCCdyguVVlVPcnduXk", + describe("create", () => { + it("should create a record and return data with id", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["create-user"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.create({ + model: "user", + data: { + id: "user-123", + email: "test@example.com", + name: "Test User", }, - ], - limit: 1, - sortBy: { direction: "desc", field: "createdAt" }, + }); + + expect(result).toBeDefined(); + expect(result.id).toBe("user-123"); }); - console.log(result); + it("should create a session record", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["create-session"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.create({ + model: "session", + data: { + id: "session-456", + userId: "user-123", + token: "abc123token", + }, + }); - // expect(result.data).toHaveLength(1); + expect(result).toBeDefined(); + expect(result.id).toBe("session-456"); + }); }); -}); -it("should properly filter by dates", async () => { - // delete all users - using buildQuery to construct the filter properly - const deleteAllResult = await fetch(`/user?$filter="id" ne '0'`, { - method: "DELETE", + describe("findOne", () => { + it("should find a single record", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-one-user"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findOne({ + model: "user", + where: [{ field: "email", operator: "eq", value: "test@example.com", connector: "AND" }], + }); + + expect(result).toBeDefined(); + expect(result?.id).toBe("user-123"); + expect(result?.email).toBe("test@example.com"); + }); + + it("should return null when no record found", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-one-user-not-found"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findOne({ + model: "user", + where: [{ field: "id", operator: "eq", value: "nonexistent", connector: "AND" }], + }); + + expect(result).toBeNull(); + }); }); - if (deleteAllResult.error) { - console.log("Error deleting all users:", deleteAllResult.error); - } - - // create user - const date = new Date("2025-01-10").toISOString(); - const createResult = await fetch("/user", { - method: "POST", - body: { - id: "filter-test", - createdAt: date, - }, - output: z.object({ id: z.string() }), + describe("findMany", () => { + it("should find multiple records", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-many-users"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findMany({ + model: "user", + }); + + expect(Array.isArray(result)).toBe(true); + expect(result.length).toBe(2); + }); + + it("should return empty array when no records found", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-many-users-empty"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findMany({ + model: "user", + where: [{ field: "email", operator: "eq", value: "nonexistent@example.com", connector: "AND" }], + }); + + expect(result).toEqual([]); + }); + + it("should apply limit", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-many-with-limit"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findMany({ + model: "user", + limit: 1, + }); + + expect(result.length).toBe(1); + }); + + it("should apply sort", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-many-sorted-desc"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.findMany({ + model: "user", + sortBy: { field: "createdAt", direction: "desc" }, + }); + + expect(result.length).toBe(2); + // First record should be newer + const first = result[0] as { createdAt: string }; + const second = result[1] as { createdAt: string }; + expect(new Date(first.createdAt).getTime()).toBeGreaterThan(new Date(second.createdAt).getTime()); + }); + }); + + describe("count", () => { + it("should count records", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["count-users"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.count({ + model: "user", + }); + + expect(result).toBe(5); + }); + }); + + describe("update", () => { + it("should update a record and return updated data", async () => { + // Update requires: find record -> patch -> read back + vi.stubGlobal( + "fetch", + createMockFetchSequence([ + mockResponses["update-find-user"], + mockResponses["update-patch-user"], + mockResponses["update-read-back-user"], + ]), + ); + const adapter = createTestAdapter()({}); + + const result = await adapter.update({ + model: "user", + where: [{ field: "id", operator: "eq", value: "user-123", connector: "AND" }], + update: { email: "updated@example.com", name: "Updated User" }, + }); + + expect(result).toBeDefined(); + expect(result?.email).toBe("updated@example.com"); + expect(result?.name).toBe("Updated User"); + }); + + it("should return null when record to update not found", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-one-user-not-found"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.update({ + model: "user", + where: [{ field: "id", operator: "eq", value: "nonexistent", connector: "AND" }], + update: { name: "New Name" }, + }); + + expect(result).toBeNull(); + }); + }); + + describe("delete", () => { + it("should delete a record", async () => { + // Delete requires: find record -> delete + vi.stubGlobal( + "fetch", + createMockFetchSequence([mockResponses["delete-find-user"], mockResponses["delete-user"]]), + ); + const adapter = createTestAdapter()({}); + + // Should not throw + await adapter.delete({ + model: "user", + where: [{ field: "id", operator: "eq", value: "user-123", connector: "AND" }], + }); + }); + + it("should do nothing when record to delete not found", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["delete-find-not-found"])); + const adapter = createTestAdapter()({}); + + // Should not throw + await adapter.delete({ + model: "user", + where: [{ field: "id", operator: "eq", value: "nonexistent", connector: "AND" }], + }); + }); }); - if (createResult.error) { - throw new Error(`Failed to create user: ${createResult.error}`); - } + describe("deleteMany", () => { + it("should delete multiple records", async () => { + // DeleteMany requires: find all -> delete each + vi.stubGlobal( + "fetch", + createMockFetchSequence([ + mockResponses["delete-many-find-users"], + mockResponses["delete-user-123"], + mockResponses["delete-user-456"], + ]), + ); + const adapter = createTestAdapter()({}); + + const result = await adapter.deleteMany({ + model: "user", + where: [{ field: "email", operator: "eq", value: "test@example.com", connector: "AND" }], + }); + + expect(result).toBe(2); + }); + + it("should return 0 when no records to delete", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["delete-find-not-found"])); + const adapter = createTestAdapter()({}); + + const result = await adapter.deleteMany({ + model: "user", + where: [{ field: "id", operator: "eq", value: "nonexistent", connector: "AND" }], + }); - const result = await fetch("/user?$filter=createdAt ge 2025-01-05", { - method: "GET", - output: z.object({ value: z.array(z.any()) }), + expect(result).toBe(0); + }); }); - console.log(result); + describe("updateMany", () => { + it("should update multiple records", async () => { + // UpdateMany requires: find all -> patch each + vi.stubGlobal( + "fetch", + createMockFetchSequence([ + mockResponses["delete-many-find-users"], // reuse the find response + mockResponses["update-patch-user"], + mockResponses["update-patch-user"], + ]), + ); + const adapter = createTestAdapter()({}); - if (result.error) { - throw new Error(`Failed to fetch users: ${result.error}`); - } + const result = await adapter.updateMany({ + model: "user", + where: [{ field: "email", operator: "eq", value: "test@example.com", connector: "AND" }], + update: { name: "Updated Name" }, + }); - expect(result.data?.value).toHaveLength(1); + expect(result).toBe(2); + }); + }); +}); - // delete record - const deleteResult = await fetch(`/user('filter-test')`, { - method: "DELETE", +describe("FileMakerAdapter configuration", () => { + it("should throw on invalid config", () => { + expect(() => + FileMakerAdapter({ + odata: { + serverUrl: "not-a-url", + auth: { apiKey: "test" }, + database: "test.fmp12", + }, + }), + ).toThrow(); }); - if (deleteResult.error) { - console.log("Error deleting test record:", deleteResult.error); - } + it("should throw when database lacks .fmp12 extension", () => { + expect(() => + FileMakerAdapter({ + odata: { + serverUrl: "https://api.example.com", + auth: { apiKey: "test" }, + database: "test", + }, + }), + ).toThrow(); + }); }); diff --git a/packages/better-auth/tests/e2e/adapter.test.ts b/packages/better-auth/tests/e2e/adapter.test.ts new file mode 100644 index 00000000..cd381ac1 --- /dev/null +++ b/packages/better-auth/tests/e2e/adapter.test.ts @@ -0,0 +1,156 @@ +import { runAdapterTest } from "better-auth/adapters/test"; +import { beforeAll, describe, expect, it } from "vitest"; +import { z } from "zod/v4"; +import { FileMakerAdapter } from "../../src"; +import { createRawFetch } from "../../src/odata"; + +if (!process.env.FM_SERVER) { + throw new Error("FM_SERVER is not set"); +} +if (!process.env.FM_DATABASE) { + throw new Error("FM_DATABASE is not set"); +} +if (!process.env.FM_USERNAME) { + throw new Error("FM_USERNAME is not set"); +} +if (!process.env.FM_PASSWORD) { + throw new Error("FM_PASSWORD is not set"); +} + +const { fetch } = createRawFetch({ + serverUrl: process.env.FM_SERVER, + auth: { + username: process.env.FM_USERNAME, + password: process.env.FM_PASSWORD, + }, + database: process.env.FM_DATABASE, + logging: "verbose", // Enable verbose logging to see the response details +}); + +describe("My Adapter Tests", async () => { + beforeAll(async () => { + // reset the database + for (const table of ["user", "session", "account", "verification"]) { + const result = await fetch(`/${table}`, { + output: z.object({ value: z.array(z.any()) }), + }); + + if (result.error) { + console.log("Error fetching records:", result.error); + continue; + } + + const records = result.data?.value || []; + for (const record of records) { + const deleteResult = await fetch(`/${table}('${record.id}')`, { + method: "DELETE", + }); + + if (deleteResult.error) { + console.log(`Error deleting record ${record.id}:`, deleteResult.error); + } + } + } + }, 60_000); + + if (!process.env.FM_SERVER) { + throw new Error("FM_SERVER is not set"); + } + if (!process.env.FM_DATABASE) { + throw new Error("FM_DATABASE is not set"); + } + if (!process.env.FM_USERNAME) { + throw new Error("FM_USERNAME is not set"); + } + if (!process.env.FM_PASSWORD) { + throw new Error("FM_PASSWORD is not set"); + } + + const adapter = FileMakerAdapter({ + debugLogs: { + isRunningAdapterTests: true, // This is our super secret flag to let us know to only log debug logs if a test fails. + }, + odata: { + auth: { + username: process.env.FM_USERNAME, + password: process.env.FM_PASSWORD, + }, + database: process.env.FM_DATABASE, + serverUrl: process.env.FM_SERVER, + }, + }); + + await runAdapterTest({ + // biome-ignore lint/suspicious/useAwait: must be an async function + getAdapter: async (betterAuthOptions = {}) => { + return adapter(betterAuthOptions); + }, + }); + + it("should sort descending", async () => { + const result = await adapter({}).findMany({ + model: "verification", + where: [ + { + field: "identifier", + operator: "eq", + value: "zyzaUHEsETWiuORCCdyguVVlVPcnduXk", + }, + ], + limit: 1, + sortBy: { direction: "desc", field: "createdAt" }, + }); + + console.log(result); + + // expect(result.data).toHaveLength(1); + }); +}); + +it("should properly filter by dates", async () => { + // delete all users - using buildQuery to construct the filter properly + const deleteAllResult = await fetch(`/user?$filter="id" ne '0'`, { + method: "DELETE", + }); + + if (deleteAllResult.error) { + console.log("Error deleting all users:", deleteAllResult.error); + } + + // create user + const date = new Date("2025-01-10").toISOString(); + const createResult = await fetch("/user", { + method: "POST", + body: { + id: "filter-test", + createdAt: date, + }, + output: z.object({ id: z.string() }), + }); + + if (createResult.error) { + throw new Error(`Failed to create user: ${createResult.error}`); + } + + const result = await fetch("/user?$filter=createdAt ge 2025-01-05", { + method: "GET", + output: z.object({ value: z.array(z.any()) }), + }); + + console.log(result); + + if (result.error) { + throw new Error(`Failed to fetch users: ${result.error}`); + } + + expect(result.data?.value).toHaveLength(1); + + // delete record + const deleteResult = await fetch(`/user('filter-test')`, { + method: "DELETE", + }); + + if (deleteResult.error) { + console.log("Error deleting test record:", deleteResult.error); + } +}); diff --git a/packages/better-auth/tests/migrate.test.ts b/packages/better-auth/tests/e2e/migrate.test.ts similarity index 100% rename from packages/better-auth/tests/migrate.test.ts rename to packages/better-auth/tests/e2e/migrate.test.ts diff --git a/packages/better-auth/tests/fixtures/responses.ts b/packages/better-auth/tests/fixtures/responses.ts new file mode 100644 index 00000000..671358ba --- /dev/null +++ b/packages/better-auth/tests/fixtures/responses.ts @@ -0,0 +1,277 @@ +/** + * Mock Response Fixtures for FileMaker OData API + * + * Contains captured/simulated responses from FileMaker OData API. + * Used by mock fetch to replay API responses in tests without a live server. + */ + +export interface MockResponse { + url: string; + method: string; + status: number; + headers?: { + "content-type"?: string; + }; + // biome-ignore lint/suspicious/noExplicitAny: API responses vary by endpoint + response: any; +} + +export type MockResponses = Record; + +/** + * Helper to create an OData response with value array + */ +function odataResponse(value: unknown[]) { + return { value }; +} + +/** + * Helper to create a single record response (for GET by id) + */ +function singleRecord(data: Record) { + return data; +} + +/** + * Captured mock responses from FileMaker OData API + */ +export const mockResponses = { + // ============ CREATE ============ + "create-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: { + id: "user-123", + email: "test@example.com", + name: "Test User", + createdAt: "2025-01-01T00:00:00.000Z", + updatedAt: "2025-01-01T00:00:00.000Z", + }, + }, + + "create-session": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/session", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: { + id: "session-456", + userId: "user-123", + token: "abc123token", + expiresAt: "2025-01-02T00:00:00.000Z", + }, + }, + + // ============ FIND ONE ============ + "find-one-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user?$top=1&$filter=email eq 'test@example.com'", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([ + { + id: "user-123", + email: "test@example.com", + name: "Test User", + createdAt: "2025-01-01T00:00:00.000Z", + updatedAt: "2025-01-01T00:00:00.000Z", + }, + ]), + }, + + "find-one-user-not-found": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user?$top=1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([]), + }, + + "find-one-session": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/session?$top=1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([ + { + id: "session-456", + userId: "user-123", + token: "abc123token", + expiresAt: "2025-01-02T00:00:00.000Z", + }, + ]), + }, + + // ============ FIND MANY ============ + "find-many-users": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([ + { + id: "user-123", + email: "test@example.com", + name: "Test User", + createdAt: "2025-01-01T00:00:00.000Z", + updatedAt: "2025-01-01T00:00:00.000Z", + }, + { + id: "user-456", + email: "other@example.com", + name: "Other User", + createdAt: "2025-01-01T00:00:00.000Z", + updatedAt: "2025-01-01T00:00:00.000Z", + }, + ]), + }, + + "find-many-users-empty": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([]), + }, + + "find-many-with-limit": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user?$top=1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([ + { + id: "user-123", + email: "test@example.com", + name: "Test User", + }, + ]), + }, + + "find-many-sorted-desc": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user?$orderby=createdAt desc", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([ + { id: "user-456", createdAt: "2025-01-02T00:00:00.000Z" }, + { id: "user-123", createdAt: "2025-01-01T00:00:00.000Z" }, + ]), + }, + + // ============ COUNT ============ + "count-users": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user/$count", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { value: 5 }, + }, + + "count-users-with-filter": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user/$count?$filter=active eq true", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { value: 3 }, + }, + + // ============ UPDATE (find + patch + read back) ============ + "update-find-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([{ id: "user-123" }]), + }, + + "update-patch-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user('user-123')", + method: "PATCH", + status: 200, + headers: { "content-type": "application/json" }, + response: null, + }, + + "update-read-back-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user('user-123')", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: singleRecord({ + id: "user-123", + email: "updated@example.com", + name: "Updated User", + updatedAt: "2025-01-02T00:00:00.000Z", + }), + }, + + // ============ DELETE (find + delete) ============ + "delete-find-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([{ id: "user-123" }]), + }, + + "delete-user": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user('user-123')", + method: "DELETE", + status: 200, + headers: { "content-type": "application/json" }, + response: null, + }, + + "delete-find-not-found": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([]), + }, + + // ============ DELETE MANY ============ + "delete-many-find-users": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: odataResponse([{ id: "user-123" }, { id: "user-456" }]), + }, + + "delete-user-123": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user('user-123')", + method: "DELETE", + status: 200, + headers: { "content-type": "application/json" }, + response: null, + }, + + "delete-user-456": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user('user-456')", + method: "DELETE", + status: 200, + headers: { "content-type": "application/json" }, + response: null, + }, + + // ============ ERROR RESPONSES ============ + "error-http-500": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 500, + headers: { "content-type": "application/json" }, + response: { error: { message: "Internal server error" } }, + }, + + "error-http-401": { + url: "https://api.example.com/otto/fmi/odata/v4/test.fmp12/user", + method: "GET", + status: 401, + headers: { "content-type": "application/json" }, + response: { error: { message: "Unauthorized" } }, + }, +} satisfies MockResponses; diff --git a/packages/better-auth/tests/setupEnv.ts b/packages/better-auth/tests/setupEnv.ts deleted file mode 100644 index 0ef7a1df..00000000 --- a/packages/better-auth/tests/setupEnv.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { config } from "dotenv"; - -config({ path: ".env.local" }); diff --git a/packages/better-auth/tests/utils/mock-fetch.ts b/packages/better-auth/tests/utils/mock-fetch.ts new file mode 100644 index 00000000..4d86fbb3 --- /dev/null +++ b/packages/better-auth/tests/utils/mock-fetch.ts @@ -0,0 +1,125 @@ +/** + * Mock Fetch Utility for OData API + * + * Creates a mock fetch function that returns pre-recorded OData API responses. + * Designed to be used with vitest's vi.stubGlobal to mock the global fetch. + * + * Usage: + * ```ts + * import { vi } from 'vitest'; + * import { createMockFetch, createMockFetchSequence } from './tests/utils/mock-fetch'; + * import { mockResponses } from './tests/fixtures/responses'; + * + * // Mock a single response + * vi.stubGlobal('fetch', createMockFetch(mockResponses['find-one-user'])); + * + * // Mock a sequence of responses (for multi-call tests) + * vi.stubGlobal('fetch', createMockFetchSequence([ + * mockResponses['find-one-user'], + * mockResponses['update-user'], + * ])); + * ``` + */ + +import type { MockResponse } from "../fixtures/responses"; + +/** + * Creates a mock fetch function that returns the provided response + */ +export function createMockFetch(response: MockResponse): typeof fetch { + return (_input: RequestInfo | URL, _init?: RequestInit): Promise => { + const contentType = response.headers?.["content-type"] || "application/json"; + const isJson = contentType.includes("application/json"); + + const headers = new Headers({ + "content-type": contentType, + }); + + if (response.headers) { + for (const [key, value] of Object.entries(response.headers)) { + if (key !== "content-type" && value) { + headers.set(key, value); + } + } + } + + const responseBody = isJson ? JSON.stringify(response.response) : String(response.response); + + return Promise.resolve( + new Response(responseBody, { + status: response.status, + statusText: response.status >= 200 && response.status < 300 ? "OK" : "Error", + headers, + }), + ); + }; +} + +/** + * Creates a mock fetch function that returns responses in sequence + * Useful for tests that make multiple API calls + */ +export function createMockFetchSequence(responses: MockResponse[]): typeof fetch { + let callIndex = 0; + + return (_input: RequestInfo | URL, _init?: RequestInit): Promise => { + const response = responses[callIndex]; + if (!response) { + throw new Error( + `Mock fetch called more times than expected. Call #${callIndex + 1}, but only ${responses.length} responses provided.`, + ); + } + callIndex++; + + const contentType = response.headers?.["content-type"] || "application/json"; + const isJson = contentType.includes("application/json"); + + const headers = new Headers({ + "content-type": contentType, + }); + + if (response.headers) { + for (const [key, value] of Object.entries(response.headers)) { + if (key !== "content-type" && value) { + headers.set(key, value); + } + } + } + + const responseBody = isJson ? JSON.stringify(response.response) : String(response.response); + + return Promise.resolve( + new Response(responseBody, { + status: response.status, + statusText: response.status >= 200 && response.status < 300 ? "OK" : "Error", + headers, + }), + ); + }; +} + +/** + * Helper to create a simple OData success response + */ +export function createODataSuccessMock(value: unknown[]): typeof fetch { + return createMockFetch({ + url: "https://api.example.com/mock", + method: "GET", + status: 200, + response: { value }, + headers: { "content-type": "application/json" }, + }); +} + +/** + * Helper to create an OData error response + */ +export function createODataErrorMock(statusCode: number, message: string): typeof fetch { + return createMockFetch({ + url: "https://api.example.com/mock", + method: "GET", + status: statusCode, + response: { error: { message } }, + headers: { "content-type": "application/json" }, + }); +} diff --git a/packages/better-auth/vitest.config.ts b/packages/better-auth/vitest.config.ts index b6fc7906..6da8974a 100644 --- a/packages/better-auth/vitest.config.ts +++ b/packages/better-auth/vitest.config.ts @@ -1,13 +1,12 @@ import { defineConfig } from "vitest/config"; -// import dotenv from "dotenv"; -// import path from "path"; - -// // Load .env.local file explicitly -// dotenv.config({ path: path.resolve(__dirname, ".env.local") }); export default defineConfig({ test: { testTimeout: 15_000, // 15 seconds, since we're making a network call to FM - setupFiles: ["./tests/setupEnv.ts"], + exclude: [ + "**/node_modules/**", + "**/dist/**", + "tests/e2e/**", // E2E tests require live FM server, run separately with test:e2e + ], }, }); diff --git a/packages/cli/.env.test b/packages/cli/.env.test deleted file mode 100644 index 10160dc4..00000000 --- a/packages/cli/.env.test +++ /dev/null @@ -1,8 +0,0 @@ -# Test environment variables for CLI tests -# Replace these values with your test environment values - -OTTO_SERVER_URL=https://acme-dev.ottomatic.cloud -OTTO_ADMIN_API_KEY=ak_rSvHqOI5nFIKjVDNjn16wzo2MvdlI4Wl -FM_DATA_API_KEY=dk_fptdBZ9fSxUoVbwNikFX83Q5qS2u2lw9 -FM_FILE_NAME=Foxtail_Demo.fmp12 -FM_LAYOUT_NAME=API_Customers diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index c032513b..995e2dad 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @proofgeist/kit +## 2.0.0-beta.10 + +### Patch Changes + +- Updated dependencies [ae07372] +- Updated dependencies [23639ec] +- Updated dependencies [dfe52a7] + - @proofkit/typegen@1.1.0-beta.5 + ## 2.0.0-beta.9 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index ebc620eb..98e5dce5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@proofkit/cli", - "version": "2.0.0-beta.9", + "version": "2.0.0-beta.10", "description": "Create web application with the ProofKit stack", "license": "MIT", "repository": { @@ -45,10 +45,8 @@ "dev": "tsdown --watch", "clean": "rm -rf dist .turbo node_modules", "start": "node dist/index.js", - "lint": "biome check .", + "lint": "biome check . --write", "lint:summary": "biome check . --reporter=summary", - "format": "biome format --write .", - "format:check": "biome format --check .", "release": "changeset version", "pub:beta": "NODE_ENV=production pnpm build && npm publish --tag beta --access public", "pub:next": "NODE_ENV=production pnpm build && npm publish --tag next --access public", @@ -57,73 +55,73 @@ }, "dependencies": { "@better-fetch/fetch": "1.1.17", - "@clack/core": "^0.3.4", + "@clack/core": "^0.3.5", "@clack/prompts": "^0.11.0", "@proofkit/fmdapi": "workspace:*", "@proofkit/typegen": "workspace:*", "@types/glob": "^8.1.0", - "axios": "^1.7.3", + "axios": "^1.13.2", "chalk": "5.4.1", - "commander": "^14.0.0", - "dotenv": "^16.5.0", - "es-toolkit": "^1.38.0", - "execa": "^9.5.3", + "commander": "^14.0.2", + "dotenv": "^16.6.1", + "es-toolkit": "^1.43.0", + "execa": "^9.6.1", "fast-glob": "^3.3.3", - "fs-extra": "^11.3.0", - "glob": "^11.0.1", + "fs-extra": "^11.3.3", + "glob": "^11.1.0", "gradient-string": "^2.0.2", "handlebars": "^4.7.8", "jiti": "^1.21.7", "jsonc-parser": "^3.3.1", - "open": "^10.1.0", + "open": "^10.2.0", "ora": "6.3.1", - "randomstring": "^1.3.0", - "semver": "^7.7.2", + "randomstring": "^1.3.1", + "semver": "^7.7.3", "shadcn": "^2.10.0", - "sort-package-json": "^2.10.0", + "sort-package-json": "^2.15.1", "ts-morph": "^26.0.0" }, "devDependencies": { - "@auth/drizzle-adapter": "^1.1.0", + "@auth/drizzle-adapter": "^1.11.1", "@auth/prisma-adapter": "^1.6.0", "@biomejs/biome": "2.3.11", - "@libsql/client": "^0.6.0", - "@planetscale/database": "^1.18.0", - "@prisma/adapter-planetscale": "^5.14.0", - "@prisma/client": "^5.14.0", + "@libsql/client": "^0.6.2", + "@planetscale/database": "^1.19.0", + "@prisma/adapter-planetscale": "^5.22.0", + "@prisma/client": "^5.22.0", "@proofkit/registry": "workspace:*", "@rollup/plugin-replace": "^6.0.3", "@t3-oss/env-nextjs": "^0.10.1", - "@tanstack/react-query": "^5.90.12", + "@tanstack/react-query": "^5.90.16", "@trpc/client": "11.0.0-rc.441", "@trpc/next": "11.0.0-rc.441", "@trpc/react-query": "11.0.0-rc.441", "@trpc/server": "11.0.0-rc.441", - "@types/axios": "^0.14.0", + "@types/axios": "^0.14.4", "@types/fs-extra": "^11.0.4", "@types/gradient-string": "^1.1.6", - "@types/node": "^22.17.1", + "@types/node": "^22.19.5", "@types/randomstring": "^1.3.0", "@types/react": "19.2.7", - "@types/semver": "^7.7.0", - "@vitest/coverage-v8": "^2.1.8", + "@types/semver": "^7.7.1", + "@vitest/coverage-v8": "^2.1.9", "drizzle-kit": "^0.21.4", "drizzle-orm": "^0.30.10", - "mysql2": "^3.9.7", + "mysql2": "^3.16.0", "next": "16.1.1", - "next-auth": "^4.24.7", - "postgres": "^3.4.4", - "prisma": "^5.14.0", + "next-auth": "^4.24.13", + "postgres": "^3.4.8", + "prisma": "^5.22.0", "publint": "^0.3.16", "react": "19.2.3", "react-dom": "19.2.3", - "superjson": "^2.2.1", - "tailwindcss": "^4.1.11", + "superjson": "^2.2.6", + "tailwindcss": "^4.1.18", "tsdown": "^0.14.2", "type-fest": "^3.13.1", "typescript": "^5.9.3", "ultracite": "7.0.8", - "vitest": "^4.0.7", - "zod": "^4.2.0" + "vitest": "^4.0.17", + "zod": "^4.3.5" } } diff --git a/packages/cli/src/cli/add/index.ts b/packages/cli/src/cli/add/index.ts index d2ea8692..4cc49092 100644 --- a/packages/cli/src/cli/add/index.ts +++ b/packages/cli/src/cli/add/index.ts @@ -1,8 +1,8 @@ import { select } from "@clack/prompts"; +import type { RegistryIndex } from "@proofkit/registry"; import { Command } from "commander"; import { capitalize, groupBy, uniq } from "es-toolkit"; import ora from "ora"; - import { ciOption, debugOption } from "~/globalOptions.js"; import { initProgramState, state } from "~/state.js"; import { logger } from "~/utils/logger.js"; @@ -77,7 +77,7 @@ const runAddFromRegistry = async (_options?: { noInstall?: boolean }) => { await runAddSchemaAction(); } else if (addType === "data") { await runAddDataSourceCommand(); - } else if (categories.includes(addType)) { + } else if ((categories as string[]).includes(addType)) { // one of the categories const itemsFromCategory = groupedByCategory[addType as keyof typeof groupedByCategory]; diff --git a/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts b/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts index 21f09c34..dd1ec34e 100644 --- a/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts +++ b/packages/cli/src/cli/add/registry/postInstall/wrap-provider.ts @@ -1,6 +1,6 @@ import path from "node:path"; import type { PostInstallStep } from "@proofkit/registry"; -import { type ImportDeclarationStructure, StructureKind, SyntaxKind } from "ts-morph"; +import { type ImportDeclarationStructure, type JsxChild, type JsxElement, StructureKind, SyntaxKind } from "ts-morph"; import { getShadcnConfig } from "~/helpers/shadcn-cli.js"; import { state } from "~/state.js"; @@ -66,9 +66,7 @@ export async function wrapProvider(step: Extract)[number]["getParentIfKind"] - >; + let targetElement: JsxElement | undefined; // Try to find the parent tag if specified if (parentTag && parentTag.length > 0) { @@ -88,7 +86,7 @@ export async function wrapProvider(step: Extract child.getText()) + .map((child: JsxChild) => child.getText()) .filter(Boolean) .join("\n"); diff --git a/packages/cli/src/cli/deploy/index.ts b/packages/cli/src/cli/deploy/index.ts index 0103dab7..dd976ae8 100644 --- a/packages/cli/src/cli/deploy/index.ts +++ b/packages/cli/src/cli/deploy/index.ts @@ -182,7 +182,7 @@ async function pushEnvironmentVariables() { try { const settings = getSettings(); - const envFile = path.join(process.cwd(), settings.envFile); + const envFile = path.join(process.cwd(), settings.envFile ?? ".env"); if (!fs.existsSync(envFile)) { spinner.stop("No environment file found"); diff --git a/packages/cli/src/cli/init.ts b/packages/cli/src/cli/init.ts index 372c76ec..ab8c1698 100644 --- a/packages/cli/src/cli/init.ts +++ b/packages/cli/src/cli/init.ts @@ -14,7 +14,6 @@ import { initializeGit } from "~/helpers/git.js"; import { installDependencies } from "~/helpers/installDependencies.js"; import { logNextSteps } from "~/helpers/logNextSteps.js"; import { setImportAlias } from "~/helpers/setImportAlias.js"; -import { getRegistryUrl, shadcnInstall } from "~/helpers/shadcn-cli.js"; import { buildPkgInstallerMap } from "~/installers/index.js"; import { ensureWebViewerAddonInstalled } from "~/installers/proofkit-webviewer.js"; import { initProgramState, state } from "~/state.js"; @@ -273,10 +272,6 @@ export const runInit = async (name?: string, opts?: CliFlags) => { await installDependencies({ projectDir }); - if (state.ui === "shadcn") { - await shadcnInstall([`${getRegistryUrl()}/r/components/mode-toggle`, "sonner", "button"]); - } - await runCodegenCommand(); if (!cliOptions.noGit) { diff --git a/packages/cli/src/generators/fmdapi.ts b/packages/cli/src/generators/fmdapi.ts index 38525a55..66bed1e8 100644 --- a/packages/cli/src/generators/fmdapi.ts +++ b/packages/cli/src/generators/fmdapi.ts @@ -21,15 +21,35 @@ interface Schema { strictNumbers?: boolean; } -// For a single data source configuration object -type ImportedDataSourceConfig = z.infer; +// For any data source configuration object (fmdapi or fmodata) +type AnyDataSourceConfig = z.infer; +// For a single fmdapi data source configuration object +type FmdapiDataSourceConfig = Extract; // For a single layout configuration object within a data source -type ImportedLayoutConfig = ImportedDataSourceConfig["layouts"][number]; +type ImportedLayoutConfig = FmdapiDataSourceConfig["layouts"][number]; // This type represents the actual structure of the JSONC file, including $schema interface FullProofkitTypegenJsonFile { $schema?: string; - config: ImportedDataSourceConfig | ImportedDataSourceConfig[]; + config: AnyDataSourceConfig | AnyDataSourceConfig[]; +} + +// Helper function to normalize data sources by adding default type for backwards compatibility +// This mirrors the zod preprocess in @proofkit/typegen that defaults type to "fmdapi" +function normalizeDataSource(ds: AnyDataSourceConfig): AnyDataSourceConfig { + if (!("type" in ds) || ds.type === undefined) { + return { ...(ds as object), type: "fmdapi" } as AnyDataSourceConfig; + } + return ds; +} + +function normalizeConfig( + config: AnyDataSourceConfig | AnyDataSourceConfig[], +): AnyDataSourceConfig | AnyDataSourceConfig[] { + if (Array.isArray(config)) { + return config.map(normalizeDataSource); + } + return normalizeDataSource(config); } // Helper functions for JSON config @@ -40,6 +60,10 @@ async function readJsonConfigFile(configPath: string): Promise ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName, + let targetDataSource: FmdapiDataSourceConfig | undefined = configArray.find( + (ds): ds is FmdapiDataSourceConfig => + ds.type === "fmdapi" && + (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName), ); if (targetDataSource) { targetDataSource.layouts = targetDataSource.layouts || []; } else { targetDataSource = { + type: "fmdapi", layouts: [], path: `./src/config/schemas/${dataSourceName}`, // other default properties for a new DataSourceConfig can be added here if needed + envNames: undefined, }; configArray.push(targetDataSource); } @@ -141,7 +169,7 @@ export async function addConfig({ projectDir, runCodegen = true, }: { - config: ImportedDataSourceConfig | ImportedDataSourceConfig[]; + config: FmdapiDataSourceConfig | FmdapiDataSourceConfig[]; projectDir: string; runCodegen?: boolean; }) { @@ -207,11 +235,14 @@ export function getClientSuffix({ const fileContent = fs.readFileSync(jsonConfigPath, "utf8"); const parsed = parseJsonc(fileContent) as FullProofkitTypegenJsonFile; - const configToSearch = Array.isArray(parsed.config) ? parsed.config : [parsed.config]; + // Normalize config to add default type for backwards compatibility + const normalizedConfig = normalizeConfig(parsed.config); + const configToSearch = Array.isArray(normalizedConfig) ? normalizedConfig : [normalizedConfig]; const targetDataSource = configToSearch.find( - (ds) => - ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName, + (ds): ds is FmdapiDataSourceConfig => + ds.type === "fmdapi" && + (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName), ); return targetDataSource?.clientSuffix ?? "Client"; } catch (error) { @@ -234,13 +265,15 @@ export function getExistingSchemas({ try { const fileContent = fs.readFileSync(jsonConfigPath, "utf8"); const parsed = parseJsonc(fileContent) as FullProofkitTypegenJsonFile; - let targetDataSource: ImportedDataSourceConfig | undefined; - const configToSearch = Array.isArray(parsed.config) ? parsed.config : [parsed.config]; + // Normalize config to add default type for backwards compatibility + const normalizedConfig = normalizeConfig(parsed.config); + const configToSearch = Array.isArray(normalizedConfig) ? normalizedConfig : [normalizedConfig]; - targetDataSource = configToSearch.find( - (ds) => - ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName, + const targetDataSource = configToSearch.find( + (ds): ds is FmdapiDataSourceConfig => + ds.type === "fmdapi" && + (ds.path?.endsWith(dataSourceName) || ds.path?.endsWith(`${dataSourceName}/`) || ds.path === dataSourceName), ); if (targetDataSource?.layouts) { @@ -267,9 +300,11 @@ export async function addToFmschemaConfig({ const jsonConfigPath = path.join(projectDir, "proofkit-typegen.config.jsonc"); let fileContent = await readJsonConfigFile(jsonConfigPath); - const newDataSource: ImportedDataSourceConfig = { + const newDataSource: FmdapiDataSourceConfig = { + type: "fmdapi", layouts: [], path: `./src/config/schemas/${dataSourceName}`, + envNames: undefined, clearOldFiles: true, clientSuffix: "Layout", }; @@ -286,7 +321,7 @@ export async function addToFmschemaConfig({ } if (fileContent) { - let configArray: ImportedDataSourceConfig[]; + let configArray: AnyDataSourceConfig[]; if (Array.isArray(fileContent.config)) { configArray = fileContent.config; } else { @@ -294,14 +329,15 @@ export async function addToFmschemaConfig({ fileContent.config = configArray; } - const existingDsIndex = configArray.findIndex((ds) => ds.path === newDataSource.path); + const existingDsIndex = configArray.findIndex((ds) => ds.type === "fmdapi" && ds.path === newDataSource.path); if (existingDsIndex === -1) { configArray.push(newDataSource); } else { + const existingConfig = configArray[existingDsIndex] as FmdapiDataSourceConfig; configArray[existingDsIndex] = { - ...configArray[existingDsIndex], + ...existingConfig, ...newDataSource, - layouts: newDataSource.layouts.length > 0 ? newDataSource.layouts : configArray[existingDsIndex]?.layouts || [], + layouts: newDataSource.layouts.length > 0 ? newDataSource.layouts : existingConfig.layouts || [], }; } } else { @@ -360,10 +396,10 @@ export async function removeFromFmschemaConfig({ dataSourceName }: { dataSourceN const pathToRemove = `./src/config/schemas/${dataSourceName}`; if (Array.isArray(fileContent.config)) { - fileContent.config = fileContent.config.filter((ds) => ds.path !== pathToRemove); + fileContent.config = fileContent.config.filter((ds) => !(ds.type === "fmdapi" && ds.path === pathToRemove)); } else { - const currentConfig = fileContent.config as ImportedDataSourceConfig; - if (currentConfig.path === pathToRemove) { + const currentConfig = fileContent.config; + if (currentConfig.type === "fmdapi" && currentConfig.path === pathToRemove) { fileContent.config = []; } } @@ -391,7 +427,7 @@ export async function removeLayout({ let dataSourceModified = false; const targetDsPath = `./src/config/schemas/${dataSourceName}`; - let configArray: ImportedDataSourceConfig[]; + let configArray: AnyDataSourceConfig[]; if (Array.isArray(fileContent.config)) { configArray = fileContent.config; } else { @@ -399,7 +435,9 @@ export async function removeLayout({ fileContent.config = configArray; } - const targetDataSource = configArray.find((ds) => ds.path === targetDsPath); + const targetDataSource = configArray.find( + (ds): ds is FmdapiDataSourceConfig => ds.type === "fmdapi" && ds.path === targetDsPath, + ); if (targetDataSource?.layouts) { const initialCount = targetDataSource.layouts.length; diff --git a/packages/cli/src/installers/proofkit-auth.ts b/packages/cli/src/installers/proofkit-auth.ts index 3f6dd0ce..7099bcca 100644 --- a/packages/cli/src/installers/proofkit-auth.ts +++ b/packages/cli/src/installers/proofkit-auth.ts @@ -1,11 +1,11 @@ import path from "node:path"; import * as p from "@clack/prompts"; +import type { OttoAPIKey } from "@proofkit/fmdapi"; import chalk from "chalk"; import dotenv from "dotenv"; import fs from "fs-extra"; import ora, { type Ora } from "ora"; import { type SourceFile, SyntaxKind } from "ts-morph"; - import { getLayouts } from "~/cli/fmdapi.js"; import { abortIfCancel, UserAbortedError } from "~/cli/utils.js"; import { PKG_ROOT } from "~/consts.js"; @@ -62,6 +62,8 @@ export const proofkitAuthInstaller = async () => { await addConfig({ config: { + type: "fmdapi", + envNames: undefined, clientSuffix: "Layout", layouts: [ { diff --git a/packages/cli/template/nextjs-shadcn/package.json b/packages/cli/template/nextjs-shadcn/package.json index bfc6c12f..a61be86e 100644 --- a/packages/cli/template/nextjs-shadcn/package.json +++ b/packages/cli/template/nextjs-shadcn/package.json @@ -11,14 +11,17 @@ "format": "biome format --write" }, "dependencies": { + "@radix-ui/react-slot": "^1.2.3", "@t3-oss/env-nextjs": "^0.13.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.541.0", "next": "^15.5.8", "next-themes": "^0.4.6", + "radix-ui": "^1.4.2", "react": "19.1.1", "react-dom": "19.1.1", + "sonner": "^2.0.4", "tailwind-merge": "^3.3.1" }, "devDependencies": { diff --git a/packages/cli/template/nextjs-shadcn/proofkit.json b/packages/cli/template/nextjs-shadcn/proofkit.json index 4e4ff5e3..13d3916d 100644 --- a/packages/cli/template/nextjs-shadcn/proofkit.json +++ b/packages/cli/template/nextjs-shadcn/proofkit.json @@ -2,5 +2,5 @@ "ui": "shadcn", "envFile": ".env", "appType": "browser", - "registryTemplates": ["utils/t3-env", "components/mode-toggle"] + "registryTemplates": ["utils/t3-env"] } diff --git a/packages/cli/template/nextjs-shadcn/src/components/mode-toggle.tsx b/packages/cli/template/nextjs-shadcn/src/components/mode-toggle.tsx new file mode 100644 index 00000000..bff50676 --- /dev/null +++ b/packages/cli/template/nextjs-shadcn/src/components/mode-toggle.tsx @@ -0,0 +1,39 @@ +"use client"; + +import { Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export function ModeToggle() { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +} diff --git a/packages/cli/template/nextjs-shadcn/src/components/ui/button.tsx b/packages/cli/template/nextjs-shadcn/src/components/ui/button.tsx new file mode 100644 index 00000000..30f83b65 --- /dev/null +++ b/packages/cli/template/nextjs-shadcn/src/components/ui/button.tsx @@ -0,0 +1,61 @@ +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import type * as React from "react"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +function Button({ + className, + variant, + size, + asChild = false, + ref, + ...props +}: ButtonProps & { ref?: React.Ref }) { + const Comp = asChild ? Slot : "button"; + return ( + + ); +} + +export { Button, buttonVariants }; diff --git a/packages/cli/template/nextjs-shadcn/src/components/ui/dropdown-menu.tsx b/packages/cli/template/nextjs-shadcn/src/components/ui/dropdown-menu.tsx new file mode 100644 index 00000000..d1c32758 --- /dev/null +++ b/packages/cli/template/nextjs-shadcn/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,267 @@ +"use client"; + +import { Check, ChevronRight, Circle } from "lucide-react"; +import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"; +import type * as React from "react"; + +import { cn } from "@/lib/utils"; + +function DropdownMenu({ + ...props +}: React.ComponentProps) { + return ; +} + +function DropdownMenuPortal({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +function DropdownMenuGroup({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuItem({ + className, + inset, + variant, + ...props +}: React.ComponentProps & { + inset?: boolean; + variant?: "destructive"; +}) { + return ( + + ); +} + +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} + +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} + +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean; +}) { + return ( + + ); +} + +function DropdownMenuRadioGroup({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuShortcut({ + className, + ...props +}: React.HTMLAttributes) { + return ( + + ); +} + +function DropdownMenuSub({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function DropdownMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentProps & { + inset?: boolean; +}) { + return ( + svg]:pointer-events-none [&>svg]:size-4 [&>svg]:shrink-0 [&_svg:not([role=img]):not([class*=text-])]:opacity-60", + inset && "ps-8", + className + )} + data-slot="dropdown-menu-sub-trigger" + {...props} + > + {children} + + + ); +} + +function DropdownMenuSubContent({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { + DropdownMenu, + DropdownMenuCheckboxItem, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuTrigger, +}; diff --git a/packages/cli/template/nextjs-shadcn/src/components/ui/sonner.tsx b/packages/cli/template/nextjs-shadcn/src/components/ui/sonner.tsx new file mode 100644 index 00000000..79926117 --- /dev/null +++ b/packages/cli/template/nextjs-shadcn/src/components/ui/sonner.tsx @@ -0,0 +1,31 @@ +"use client"; + +import { useTheme } from "next-themes"; +import { Toaster as Sonner } from "sonner"; + +type ToasterProps = React.ComponentProps; + +function Toaster({ ...props }: ToasterProps) { + const { theme = "system" } = useTheme(); + + return ( + + ); +} + +export { Toaster }; diff --git a/packages/cli/tests/browser-apps.test.ts b/packages/cli/tests/browser-apps.test.ts index 4e12052a..a9a9243a 100644 --- a/packages/cli/tests/browser-apps.test.ts +++ b/packages/cli/tests/browser-apps.test.ts @@ -1,5 +1,5 @@ import { execSync } from "node:child_process"; -import { existsSync, mkdirSync, readFileSync } from "node:fs"; +import { existsSync, mkdirSync, readFileSync, rmSync } from "node:fs"; import { join } from "node:path"; import { beforeEach, describe, expect, it } from "vitest"; import { z } from "zod/v4"; @@ -10,11 +10,13 @@ describe("Non-Interactive CLI Tests", () => { // Use root-level tmp directory for test outputs const testDir = join(__dirname, "..", "..", "tmp", "cli-tests"); const cliPath = join(__dirname, "..", "dist", "index.js"); + const projectName = "test-fm-project"; + const projectDir = join(testDir, projectName); // Parse test environment variables const testEnv = z .object({ - OTTO_SERVER_URL: z.string().url(), + OTTO_SERVER_URL: z.url(), OTTO_ADMIN_API_KEY: z.string().min(1), FM_DATA_API_KEY: z.string().min(1), FM_FILE_NAME: z.string().min(1), @@ -22,14 +24,19 @@ describe("Non-Interactive CLI Tests", () => { }) .parse(process.env); - beforeEach(() => { - // Ensure the test directory exists - mkdirSync(testDir, { recursive: true }); - }); + beforeEach( + () => { + // Clean up any stale test project from previous runs + if (existsSync(projectDir)) { + rmSync(projectDir, { recursive: true, force: true }); + } + // Ensure the test directory exists + mkdirSync(testDir, { recursive: true }); + }, + 30_000, // 30s timeout for cleanup of large node_modules + ); it("should create a project with FileMaker integration in CI mode", () => { - const projectName = "test-fm-project"; - // Build the command with all necessary flags for non-interactive mode const command = [ `node "${cliPath}" init`, @@ -57,8 +64,6 @@ describe("Non-Interactive CLI Tests", () => { }); }).not.toThrow(); - const projectDir = join(testDir, projectName); - // Verify project structure expect(existsSync(projectDir)).toBe(true); expect(existsSync(join(projectDir, "package.json"))).toBe(true); diff --git a/packages/cli/tests/test-utils.ts b/packages/cli/tests/test-utils.ts index c105f6bb..e673c887 100644 --- a/packages/cli/tests/test-utils.ts +++ b/packages/cli/tests/test-utils.ts @@ -1,4 +1,33 @@ import { execSync } from "node:child_process"; +import { readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; + +/** + * Replaces @proofkit/* package versions with "latest" in package.json + * This fixes CI issues where scaffolded projects reference unpublished versions + */ +function useLatestProofkitVersions(projectDir: string): void { + const pkgPath = join(projectDir, "package.json"); + const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")); + + const replaceProofkitVersions = (deps: Record | undefined) => { + if (!deps) { + return; + } + for (const name of Object.keys(deps)) { + if (name.startsWith("@proofkit/")) { + console.log(` Replacing ${name}@${deps[name]} with latest`); + deps[name] = "latest"; + } + } + }; + + console.log("Using latest published @proofkit/* versions..."); + replaceProofkitVersions(pkg.dependencies); + replaceProofkitVersions(pkg.devDependencies); + + writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)); +} /** * Verifies that a project at the given directory can be built without errors @@ -9,6 +38,9 @@ export function verifyProjectBuilds(projectDir: string): void { console.log(`\nVerifying project build in ${projectDir}...`); try { + // Replace unpublished @proofkit versions with latest + useLatestProofkitVersions(projectDir); + console.log("Installing dependencies..."); // Run pnpm install while ignoring workspace settings execSync("pnpm install --prefer-offline --ignore-workspace", { diff --git a/packages/cli/vitest.config.ts b/packages/cli/vitest.config.ts index ded13629..74e257a7 100644 --- a/packages/cli/vitest.config.ts +++ b/packages/cli/vitest.config.ts @@ -1,16 +1,13 @@ -import path from "node:path"; -import dotenv from "dotenv"; import { defineConfig } from "vitest/config"; -// Load test environment variables -dotenv.config({ path: path.resolve(__dirname, ".env.test") }); - export default defineConfig({ test: { globals: true, environment: "node", setupFiles: ["./tests/setup.ts"], include: ["tests/**/*.test.ts"], + // Exclude E2E tests that require real credentials + exclude: ["**/node_modules/**", "**/dist/**", "tests/browser-apps.test.ts"], testTimeout: 60_000, // 60 seconds for CLI tests which can be slow coverage: { provider: "v8", diff --git a/packages/create-proofkit/package.json b/packages/create-proofkit/package.json index 88214ea8..f0530a0e 100644 --- a/packages/create-proofkit/package.json +++ b/packages/create-proofkit/package.json @@ -20,7 +20,7 @@ "lint:summary": "biome check . --reporter=summary" }, "dependencies": { - "execa": "^9.5.3" + "execa": "^9.6.1" }, "engines": { "node": ">=20.12.0" diff --git a/packages/fmdapi/op.env b/packages/fmdapi/op.env deleted file mode 100644 index a35f225f..00000000 --- a/packages/fmdapi/op.env +++ /dev/null @@ -1,19 +0,0 @@ -# __ _____ _ -# /_ | __ \ | | -# | | |__) |_ _ ___ _____ _____ _ __ __| | ___ _ ____ __ -# | | ___/ _` / __/ __\ \ /\ / / _ \| '__/ _` | / _ \ '_ \ \ / / -# | | | | (_| \__ \__ \\ V V / (_) | | | (_| || __/ | | \ V / -# |_|_| \__,_|___/___/ \_/\_/ \___/|_| \__,_(_)___|_| |_|\_/ -# -# This file is intentionally commited to source control. -# It should only reference secrets in 1Password - -DIFFERENT_FM_SERVER="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_SERVER" -DIFFERENT_FM_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_DATABASE" -DIFFERENT_OTTO_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/OTTO_API_KEY" - -FM_SERVER="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_SERVER" -FM_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_DATABASE" -OTTO_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/OTTO_API_KEY" -FM_USERNAME="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/username" -FM_PASSWORD="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/password" diff --git a/packages/fmdapi/package.json b/packages/fmdapi/package.json index a1478312..7a6b2739 100644 --- a/packages/fmdapi/package.json +++ b/packages/fmdapi/package.json @@ -45,7 +45,9 @@ "dev": "tsc --watch", "ci": "pnpm build && pnpm check-format && pnpm publint --strict && pnpm test", "test": "vitest run", - "setup-env": "op inject -i op.env -o .env.local -f", + "test:e2e": "doppler run -- vitest run tests/e2e", + "capture": "doppler run -- npx tsx scripts/capture-responses.ts", + "typecheck": "tsc --noEmit", "changeset": "changeset", "release": "pnpm build && changeset publish --access public", "knip": "knip", @@ -53,25 +55,25 @@ "lint:summary": "biome check . --reporter=summary" }, "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@tanstack/vite-config": "^0.2.0", + "@standard-schema/spec": "^1.1.0", + "@tanstack/vite-config": "^0.2.1", "chalk": "5.4.1", - "commander": "^14.0.0", - "dotenv": "^16.5.0", - "fs-extra": "^11.3.0", + "commander": "^14.0.2", + "dotenv": "^16.6.1", + "fs-extra": "^11.3.3", "ts-morph": "^26.0.0", - "vite": "^6.3.4", - "zod": "^4.2.0" + "vite": "^6.4.1", + "zod": "^4.3.5" }, "devDependencies": { "@types/fs-extra": "^11.0.4", - "@types/node": "^22.17.1", - "@upstash/redis": "^1.34.6", - "knip": "^5.56.0", + "@types/node": "^22.19.5", + "@upstash/redis": "^1.36.1", + "knip": "^5.80.2", "publint": "^0.3.16", "ts-toolbelt": "^9.6.0", "typescript": "^5.9.3", - "vitest": "^4.0.7" + "vitest": "^4.0.17" }, "engines": { "node": ">=18.0.0" diff --git a/packages/fmdapi/scripts/capture-responses.ts b/packages/fmdapi/scripts/capture-responses.ts new file mode 100644 index 00000000..1462c8a5 --- /dev/null +++ b/packages/fmdapi/scripts/capture-responses.ts @@ -0,0 +1,518 @@ +/** + * Response Capture Script + * + * This script executes real queries against a live FileMaker Data API server + * and captures the responses for use in mock tests. + * + * This script uses native fetch directly (not our library) to ensure raw API + * responses are captured without any transformations or processing. + * + * Setup: + * - Ensure you have environment variables set (via doppler or .env): + * - FM_SERVER + * - FM_DATABASE + * - OTTO_API_KEY (dk_* or KEY_* format) + * + * Usage: + * pnpm capture + * + * How to add new queries to capture: + * 1. Add a new entry to the `queriesToCapture` array below + * 2. Each entry should have: + * - name: A descriptive name (used as the key in the fixtures file) + * - execute: A function that makes the API call + * 3. Run `pnpm capture` + * 4. The captured response will be automatically added to tests/fixtures/responses.ts + * + * Query names should be descriptive and follow a pattern like: + * - "list-basic" - Basic list query + * - "list-with-limit" - List with limit param + * - "find-basic" - Basic find query + * - "error-missing-layout" - Error response for missing layout + */ +/** biome-ignore-all lint/suspicious/noExplicitAny: Just a dev script */ + +import { writeFileSync } from "node:fs"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { config } from "dotenv"; + +import { MOCK_SERVER_URL } from "../tests/utils/mock-server-url"; + +// Get __dirname equivalent in ES modules +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Load environment variables +config({ path: path.resolve(__dirname, "../.env.local") }); + +const server = process.env.FM_SERVER; +const database = process.env.FM_DATABASE; +const apiKey = process.env.OTTO_API_KEY; + +if (!server) { + throw new Error("FM_SERVER environment variable is required"); +} + +if (!database) { + throw new Error("FM_DATABASE environment variable is required"); +} + +if (!apiKey) { + throw new Error("OTTO_API_KEY environment variable is required"); +} + +// Type for captured response +interface CapturedResponse { + url: string; + method: string; + status: number; + headers?: { + "content-type"?: string; + }; + response: any; +} + +// Storage for captured responses - maps query name to response +const capturedResponses: Record = {}; + +/** + * Build base URL for FileMaker Data API based on API key type + */ +function buildBaseUrl(serverUrl: string, db: string, key: string): string { + // Ensure server has https + const cleanServer = serverUrl.startsWith("http") ? serverUrl : `https://${serverUrl}`; + + if (key.startsWith("dk_")) { + // OttoFMS uses /otto prefix + return `${cleanServer}/otto/fmi/data/vLatest/databases/${encodeURIComponent(db)}`; + } + if (key.startsWith("KEY_")) { + // Otto v3 uses port 3030 + const url = new URL(cleanServer); + url.port = "3030"; + return `${url.origin}/fmi/data/vLatest/databases/${encodeURIComponent(db)}`; + } + // Default FM Data API + return `${cleanServer}/fmi/data/vLatest/databases/${encodeURIComponent(db)}`; +} + +/** + * Sanitizes URLs by replacing the actual server domain with the mock server URL + */ +function sanitizeUrl(url: string, actualServerUrl: string): string { + try { + const serverUrlObj = new URL(actualServerUrl.startsWith("http") ? actualServerUrl : `https://${actualServerUrl}`); + const actualDomain = serverUrlObj.hostname; + return url.replace(new RegExp(actualDomain.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), MOCK_SERVER_URL); + } catch { + return url; + } +} + +/** + * Recursively sanitizes all URLs in a response object + */ +function sanitizeResponseData(data: any, actualServerUrl: string): any { + if (typeof data === "string") { + if (data.startsWith("http://") || data.startsWith("https://")) { + return sanitizeUrl(data, actualServerUrl); + } + return data; + } + + if (Array.isArray(data)) { + return data.map((item) => sanitizeResponseData(item, actualServerUrl)); + } + + if (data && typeof data === "object") { + const sanitized: any = {}; + for (const [key, value] of Object.entries(data)) { + sanitized[key] = sanitizeResponseData(value, actualServerUrl); + } + return sanitized; + } + + return data; +} + +/** + * Creates a fetch wrapper with authorization header + */ +function createAuthenticatedFetch(baseUrl: string, key: string) { + return async ( + path: string, + init?: RequestInit & { body?: any }, + ): Promise<{ url: string; method: string; response: Response }> => { + const fullPath = path.startsWith("/") ? path : `/${path}`; + const fullUrl = `${baseUrl}${fullPath}`; + + const headers = new Headers(init?.headers); + headers.set("Authorization", `Bearer ${key}`); + if (init?.body && !(init.body instanceof FormData)) { + headers.set("Content-Type", "application/json"); + } + + let body: string | FormData | undefined; + if (init?.body instanceof FormData) { + body = init.body; + } else if (init?.body) { + body = JSON.stringify(init.body); + } + + const response = await fetch(fullUrl, { + ...init, + headers, + body, + }); + + return { url: fullUrl, method: init?.method ?? "GET", response }; + }; +} + +/** + * Query definitions to capture + */ +const queriesToCapture: { + name: string; + description: string; + expectError?: boolean; + execute: ( + apiFetch: ReturnType, + ) => Promise<{ url: string; method: string; response: Response }>; +}[] = [ + { + name: "list-basic", + description: "Basic list query without params", + execute: (apiFetch) => apiFetch("/layouts/layout/records"), + }, + { + name: "list-with-limit", + description: "List query with _limit parameter", + execute: (apiFetch) => apiFetch("/layouts/layout/records?_limit=1"), + }, + { + name: "list-with-offset", + description: "List query with _limit and _offset", + execute: (apiFetch) => apiFetch("/layouts/layout/records?_limit=1&_offset=2"), + }, + { + name: "list-with-sort-descend", + description: "List query with sort descending", + execute: (apiFetch) => { + const sort = JSON.stringify([{ fieldName: "recordId", sortOrder: "descend" }]); + return apiFetch(`/layouts/layout/records?_sort=${encodeURIComponent(sort)}`); + }, + }, + { + name: "list-with-sort-ascend", + description: "List query with sort ascending (default)", + execute: (apiFetch) => { + const sort = JSON.stringify([{ fieldName: "recordId" }]); + return apiFetch(`/layouts/layout/records?_sort=${encodeURIComponent(sort)}`); + }, + }, + { + name: "list-with-portals", + description: "List query that includes portal data", + execute: (apiFetch) => apiFetch("/layouts/layout/records?_limit=1"), + }, + { + name: "list-with-portal-ranges", + description: "List query with portal limit and offset", + execute: (apiFetch) => apiFetch("/layouts/layout/records?_limit=1&_limit.test=1&_offset.test=2"), + }, + { + name: "find-basic", + description: "Basic find query", + execute: (apiFetch) => + apiFetch("/layouts/layout/_find", { + method: "POST", + body: { query: [{ anything: "anything" }] }, + }), + }, + { + name: "find-unique", + description: "Find query returning single record", + execute: (apiFetch) => + apiFetch("/layouts/layout/_find", { + method: "POST", + body: { query: [{ anything: "unique" }] }, + }), + }, + { + name: "find-with-omit", + description: "Find query with omit", + execute: (apiFetch) => + apiFetch("/layouts/layout/_find", { + method: "POST", + body: { query: [{ anything: "anything", omit: "true" }] }, + }), + }, + { + name: "find-no-results", + description: "Find query with no results (error 401)", + expectError: true, + execute: (apiFetch) => + apiFetch("/layouts/layout/_find", { + method: "POST", + body: { query: [{ anything: "DOES_NOT_EXIST_12345" }] }, + }), + }, + { + name: "get-record", + description: "Get single record by ID", + execute: async (apiFetch) => { + // First get a record ID from list + const listResult = await apiFetch("/layouts/layout/records?_limit=1"); + const listData = await listResult.response.clone().json(); + const recordId = listData.response?.data?.[0]?.recordId ?? "1"; + return apiFetch(`/layouts/layout/records/${recordId}`); + }, + }, + { + name: "layout-metadata", + description: "Get layout metadata", + execute: (apiFetch) => apiFetch("/layouts/layout"), + }, + { + name: "all-layouts", + description: "Get all layouts metadata", + execute: (apiFetch) => apiFetch("/layouts"), + }, + { + name: "all-scripts", + description: "Get all scripts metadata", + execute: (apiFetch) => apiFetch("/scripts"), + }, + { + name: "execute-script", + description: "Execute a script with parameter", + execute: (apiFetch) => { + const param = encodeURIComponent(JSON.stringify({ hello: "world" })); + return apiFetch(`/layouts/layout/script/script?script.param=${param}`); + }, + }, + { + name: "error-missing-layout", + description: "Error response for missing layout", + expectError: true, + execute: (apiFetch) => apiFetch("/layouts/not_a_layout/records"), + }, + { + name: "customer-list", + description: "List from customer layout (for zod tests)", + execute: (apiFetch) => apiFetch("/layouts/customer/records?_limit=5"), + }, + { + name: "customer-find", + description: "Find from customer layout", + execute: (apiFetch) => + apiFetch("/layouts/customer/_find", { + method: "POST", + body: { query: [{ name: "test" }] }, + }), + }, + { + name: "weird-portals-list", + description: "List from Weird Portals layout", + execute: (apiFetch) => { + const portalName = encodeURIComponent("long_and_strange.portalName#forTesting"); + return apiFetch(`/layouts/Weird%20Portals/records?_limit=1&_limit.${portalName}=100`); + }, + }, +]; + +/** + * Formats a JavaScript object as a TypeScript-compatible string with proper indentation + */ +function formatObject(obj: any, indent = 2): string { + const spaces = " ".repeat(indent); + if (obj === null) { + return "null"; + } + if (obj === undefined) { + return "undefined"; + } + if (typeof obj === "string") { + return JSON.stringify(obj); + } + if (typeof obj === "number" || typeof obj === "boolean") { + return String(obj); + } + if (Array.isArray(obj)) { + if (obj.length === 0) { + return "[]"; + } + const items = obj.map((item) => `${spaces}${formatObject(item, indent + 2)},`).join("\n"); + return `[\n${items}\n${" ".repeat(indent - 2)}]`; + } + if (typeof obj === "object") { + const keys = Object.keys(obj); + if (keys.length === 0) { + return "{}"; + } + const entries = keys + .map((key) => { + const value = formatObject(obj[key], indent + 2); + return `${spaces}${JSON.stringify(key)}: ${value}`; + }) + .join(",\n"); + return `{\n${entries}\n${" ".repeat(indent - 2)}}`; + } + return String(obj); +} + +/** + * Generates TypeScript code for the responses file + */ +function generateResponsesFile(responses: Record): string { + const entries = Object.entries(responses) + .map(([key, response]) => { + const urlStr = JSON.stringify(response.url); + const methodStr = JSON.stringify(response.method); + const statusStr = response.status; + const responseStr = formatObject(response.response); + + const headersLine = response.headers ? `\n headers: ${formatObject(response.headers, 4)},` : ""; + + return ` "${key}": { + url: ${urlStr}, + method: ${methodStr}, + status: ${statusStr},${headersLine} + response: ${responseStr}, + },`; + }) + .join("\n\n"); + + return `/** + * Mock Response Fixtures + * + * This file contains captured responses from real FileMaker Data API calls. + * These responses are used by the mock fetch implementation to replay API responses + * in tests without requiring a live server connection. + * + * Format: + * - Each response is keyed by a descriptive query name + * - Each response object contains: + * - url: The full request URL (for reference) + * - method: HTTP method + * - status: Response status code + * - response: The actual response data (JSON-parsed, unwrapped from FM envelope) + * + * To add new mock responses: + * 1. Add a query definition to scripts/capture-responses.ts + * 2. Run: pnpm capture + * 3. The captured response will be added to this file automatically + * + * You MUST NOT manually edit this file. Any changes will be overwritten by the capture script. + */ + +export type MockResponse = { + url: string; + method: string; + status: number; + headers?: { + "content-type"?: string; + }; + response: any; +}; + +export type MockResponses = Record; + +/** + * Captured mock responses from FileMaker Data API + * + * These responses are used in tests by passing them to createMockFetch(). + * Each test explicitly declares which response it expects. + */ +export const mockResponses = { +${entries} +} satisfies MockResponses; +`; +} + +async function main() { + console.log("Starting response capture...\n"); + + if (!(database && server && apiKey)) { + throw new Error("Required environment variables not set"); + } + + const baseUrl = buildBaseUrl(server, database, apiKey); + const apiFetch = createAuthenticatedFetch(baseUrl, apiKey); + + // Execute each query and capture responses + for (const queryDef of queriesToCapture) { + try { + console.log(`Capturing: ${queryDef.name} - ${queryDef.description}`); + + const { url, method, response } = await queryDef.execute(apiFetch); + + const status = response.status; + const contentType = response.headers.get("content-type") || ""; + let responseData: any; + + if (contentType.includes("application/json")) { + try { + const clonedResponse = response.clone(); + responseData = await clonedResponse.json(); + } catch { + responseData = null; + } + } else { + const clonedResponse = response.clone(); + responseData = await clonedResponse.text(); + } + + // Sanitize URLs before storing + const sanitizedUrl = sanitizeUrl(url, server); + const sanitizedResponse = sanitizeResponseData(responseData, server); + + capturedResponses[queryDef.name] = { + url: sanitizedUrl, + method, + status, + headers: contentType + ? { + "content-type": contentType, + } + : undefined, + response: sanitizedResponse, + }; + + if (status >= 400 && !queryDef.expectError) { + console.log(` Warning: Captured error response for ${queryDef.name} (status: ${status})`); + } else { + console.log(` Captured: ${queryDef.name}`); + } + } catch (error) { + console.error(` Failed: ${queryDef.name}:`, error); + if (error instanceof Error) { + console.error(` ${error.message}`); + } + } + } + + console.log("\nCapture complete!"); + console.log(`Captured ${Object.keys(capturedResponses).length} responses`); + + if (Object.keys(capturedResponses).length === 0) { + console.warn("Warning: No responses were captured. Check your queries and server connection."); + return; + } + + // Generate and write the responses file + const fixturesPath = path.resolve(__dirname, "../tests/fixtures/responses.ts"); + const fileContent = generateResponsesFile(capturedResponses); + + writeFileSync(fixturesPath, fileContent, "utf-8"); + + console.log(`\nResponses written to: ${fixturesPath}`); + console.log("\nYou can now use these mocks in your tests!"); +} + +main().catch((error) => { + console.error("Capture script failed:", error); + process.exit(1); +}); diff --git a/packages/fmdapi/tests/client-methods.test.ts b/packages/fmdapi/tests/client-methods.test.ts index ace9937a..21804d07 100644 --- a/packages/fmdapi/tests/client-methods.test.ts +++ b/packages/fmdapi/tests/client-methods.test.ts @@ -1,20 +1,50 @@ -import { describe, expect, it, test } from "vitest"; -import { DataApi, OttoAdapter } from "../src"; +/** + * Unit tests for client methods using mocked responses. + * These tests verify the client behavior without requiring a live FileMaker server. + */ +import { afterEach, describe, expect, it, test, vi } from "vitest"; +import { z } from "zod/v4"; import type { AllLayoutsMetadataResponse, Layout, ScriptOrFolder, ScriptsMetadataResponse } from "../src/client-types"; -import { config, containerClient, layoutClient, weirdPortalClient } from "./setup"; +import { DataApi, FileMakerError, OttoAdapter } from "../src/index"; +import { mockResponses } from "./fixtures/responses"; +import { createMockFetch, createMockFetchSequence } from "./utils/mock-fetch"; + +// Test client factory - creates a client with mocked fetch +function createTestClient(layout = "layout") { + return DataApi({ + adapter: new OttoAdapter({ + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", + }), + layout, + }); +} describe("sort methods", () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + test("should sort descending", async () => { - const resp = await layoutClient.list({ + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-sorted-descend"])); + const client = createTestClient(); + + const resp = await client.list({ sort: { fieldName: "recordId", sortOrder: "descend" }, }); + expect(resp.data.length).toBe(3); const firstRecord = Number.parseInt(resp.data[0]?.fieldData.recordId as string, 10); const secondRecord = Number.parseInt(resp.data[1]?.fieldData.recordId as string, 10); expect(firstRecord).toBeGreaterThan(secondRecord); }); + test("should sort ascending by default", async () => { - const resp = await layoutClient.list({ + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-sorted-ascend"])); + const client = createTestClient(); + + const resp = await client.list({ sort: { fieldName: "recordId" }, }); @@ -25,160 +55,125 @@ describe("sort methods", () => { }); describe("find methods", () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", + afterEach(() => { + vi.unstubAllGlobals(); }); test("successful find", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-basic"])); + const client = createTestClient(); + const resp = await client.find({ query: { anything: "anything" }, }); expect(Array.isArray(resp.data)).toBe(true); + expect(resp.data.length).toBe(2); }); + test("successful findFirst with multiple return", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-basic"])); + const client = createTestClient(); + const resp = await client.findFirst({ query: { anything: "anything" }, }); + expect(Array.isArray(resp.data)).toBe(false); + expect(resp.data.fieldData).toBeDefined(); }); + test("successful findOne", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-unique"])); + const client = createTestClient(); + const resp = await client.findOne({ query: { anything: "unique" }, }); expect(Array.isArray(resp.data)).toBe(false); }); - it("find with omit", async () => { - await layoutClient.find({ - query: { anything: "anything", omit: "true" }, - }); + + it("findOne with 2 results should fail", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["find-basic"])); + const client = createTestClient(); + + await expect( + client.findOne({ + query: { anything: "anything" }, + }), + ).rejects.toThrow(); }); }); describe("portal methods", () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("should return portal data with default limit", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-with-portal-data"])); + const client = createTestClient(); + + const result = await client.list({ limit: 1 }); + expect(result.data[0]?.portalData?.test?.length).toBe(50); + }); + it("should return portal data with limit and offset", async () => { - const result = await layoutClient.list({ - limit: 1, - }); - expect(result.data[0]?.portalData?.test?.length).toBe(50); // default portal limit is 50 + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-with-portal-ranges"])); + const client = createTestClient(); - const { data } = await layoutClient.list({ + const { data } = await client.list({ limit: 1, portalRanges: { test: { limit: 1, offset: 2 } }, }); - expect(data.length).toBe(1); + expect(data.length).toBe(1); const portalData = data[0]?.portalData; const testPortal = portalData?.test; expect(testPortal?.length).toBe(1); - expect(testPortal?.[0]?.["related::related_field"]).toContain("2"); // we should get the 2nd record - }); - it("should update portal data", async () => { - await layoutClient.update({ - recordId: 1, - fieldData: { anything: "anything" }, - portalData: { - test: [{ "related::related_field": "updated", recordId: "1" }], - }, - }); - }); - it("should handle portal methods with strange names", async () => { - const { data } = await weirdPortalClient.list({ - limit: 1, - portalRanges: { - "long_and_strange.portalName#forTesting": { limit: 100 }, - }, - }); - - expect("long_and_strange.portalName#forTesting" in (data?.[0]?.portalData ?? {})).toBeTruthy(); - - const portalData = data[0]?.portalData["long_and_strange.portalName#forTesting"]; - - expect(portalData?.length).toBeGreaterThan(50); + expect(testPortal?.[0]?.["related::related_field"]).toContain("2"); }); }); describe("other methods", () => { - it("should allow list method without layout param", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); - - await client.list(); + afterEach(() => { + vi.unstubAllGlobals(); }); - it("findOne with 2 results should fail", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); + it("should allow list method without params", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-basic"])); + const client = createTestClient(); - await expect( - client.findOne({ - query: { anything: "anything" }, - }), - ).rejects.toThrow(); + const result = await client.list(); + expect(result.data).toBeDefined(); }); it("should rename offset param", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); + vi.stubGlobal("fetch", createMockFetch(mockResponses["list-basic"])); + const client = createTestClient(); - await client.list({ - offset: 0, - }); + await client.list({ offset: 0 }); }); it("should retrieve a list of folders and layouts", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); + vi.stubGlobal("fetch", createMockFetch(mockResponses["all-layouts"])); + const client = createTestClient(); const resp = (await client.layouts()) as AllLayoutsMetadataResponse; expect(Object.hasOwn(resp, "layouts")).toBe(true); expect(resp.layouts.length).toBeGreaterThanOrEqual(2); expect(resp.layouts[0] as Layout).toHaveProperty("name"); - const layoutFoler = resp.layouts.find((o) => "isFolder" in o); - expect(layoutFoler).not.toBeUndefined(); - expect(layoutFoler).toHaveProperty("isFolder"); - expect(layoutFoler).toHaveProperty("folderLayoutNames"); + const layoutFolder = resp.layouts.find((o) => "isFolder" in o); + expect(layoutFolder).not.toBeUndefined(); + expect(layoutFolder).toHaveProperty("isFolder"); + expect(layoutFolder).toHaveProperty("folderLayoutNames"); }); + it("should retrieve a list of folders and scripts", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); + vi.stubGlobal("fetch", createMockFetch(mockResponses["all-scripts"])); + const client = createTestClient(); const resp = (await client.scripts()) as ScriptsMetadataResponse; @@ -188,147 +183,212 @@ describe("other methods", () => { expect(resp.scripts[1] as ScriptOrFolder).toHaveProperty("isFolder"); }); - it("should retrieve layout metadata with only the layout parameter", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", - }); + it("should retrieve layout metadata", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["layout-metadata"])); + const client = createTestClient(); - // Call the method with only the required layout parameter const response = await client.layoutMetadata(); - // Assertion 1: Ensure the call succeeded and returned a response object expect(response).toBeDefined(); expect(response).toBeTypeOf("object"); - - // Assertion 2: Check for the presence of core metadata properties expect(response).toHaveProperty("fieldMetaData"); expect(response).toHaveProperty("portalMetaData"); - // valueLists is optional, check type if present - if (response.valueLists) { - expect(Array.isArray(response.valueLists)).toBe(true); - } - - // Assertion 3: Verify the types of the core properties expect(Array.isArray(response.fieldMetaData)).toBe(true); expect(typeof response.portalMetaData).toBe("object"); - // Assertion 4 (Optional but recommended): Check structure of metadata if (response.fieldMetaData.length > 0) { expect(response.fieldMetaData[0]).toHaveProperty("name"); expect(response.fieldMetaData[0]).toHaveProperty("type"); } }); - it("should retrieve layout metadata when layout is configured on the client", async () => { - const client = DataApi({ - adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, - }), - layout: "layout", // Configure layout on the client + it("should paginate through all records", async () => { + // listAll will make multiple calls until all records are fetched + vi.stubGlobal( + "fetch", + createMockFetchSequence([ + mockResponses["list-with-limit"], + mockResponses["list-with-limit"], + mockResponses["list-with-limit"], + ]), + ); + const client = createTestClient(); + + const data = await client.listAll({ limit: 1 }); + expect(data.length).toBe(3); + }); + + it("should paginate using findAll method", async () => { + vi.stubGlobal("fetch", createMockFetchSequence([mockResponses["find-basic"], mockResponses["find-no-results"]])); + const client = createTestClient(); + + const data = await client.findAll({ + query: { anything: "anything" }, + limit: 1, }); - // Call the method without the layout parameter (expecting it to use the client's layout) - // No arguments should be needed when layout is configured on the client. - const response = await client.layoutMetadata(); + expect(data.length).toBe(2); + }); - // Assertion 1: Ensure the call succeeded and returned a response object - expect(response).toBeDefined(); - expect(response).toBeTypeOf("object"); + it("should return from execute script", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["execute-script"])); + const client = createTestClient(); - // Assertion 2: Check for the presence of core metadata properties - expect(response).toHaveProperty("fieldMetaData"); - expect(response).toHaveProperty("portalMetaData"); - // valueLists is optional, check type if present - if (response.valueLists) { - expect(Array.isArray(response.valueLists)).toBe(true); - } + const param = JSON.stringify({ hello: "world" }); - // Assertion 3: Verify the types of the core properties - expect(Array.isArray(response.fieldMetaData)).toBe(true); - expect(typeof response.portalMetaData).toBe("object"); + const resp = await client.executeScript({ + script: "script", + scriptParam: param, + }); - // Assertion 4 (Optional but recommended): Check structure of metadata - if (response.fieldMetaData.length > 0) { - expect(response.fieldMetaData[0]).toHaveProperty("name"); - expect(response.fieldMetaData[0]).toHaveProperty("type"); - } + expect(resp.scriptResult).toBe("result"); }); +}); - it("should paginate through all records", async () => { +describe("error handling", () => { + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("missing layout should error", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["error-missing-layout"])); const client = DataApi({ adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", }), - layout: "layout", + layout: "not_a_layout", }); - const data = await client.listAll({ limit: 1 }); - expect(data.length).toBe(3); + await client.list().catch((err) => { + expect(err).toBeInstanceOf(FileMakerError); + expect(err.code).toBe("105"); + }); }); +}); + +describe("zod validation", () => { + const ZCustomer = z.object({ name: z.string(), phone: z.string() }); + const ZPortalTable = z.object({ + "related::related_field": z.string(), + }); + + const ZCustomerPortals = { + PortalTable: ZPortalTable, + }; + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("should pass validation, allow extra fields", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["customer-list"])); - it("should paginate using findAll method", async () => { const client = DataApi({ adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", }), - layout: "layout", + layout: "customer", + schema: { fieldData: ZCustomer }, }); - const data = await client.findAll({ - query: { anything: "anything" }, - limit: 1, + await client.list(); + }); + + it("list method: should fail validation when field is missing", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["customer-fields-missing"])); + + const client = DataApi({ + adapter: new OttoAdapter({ + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", + }), + layout: "customer_fieldsMissing", + schema: { fieldData: ZCustomer }, }); - expect(data.length).toBe(2); + await expect(client.list()).rejects.toBeInstanceOf(Error); }); - it("should return from execute script", async () => { + it("find method: should properly infer from root type", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["customer-find"])); + const client = DataApi({ adapter: new OttoAdapter({ - auth: config.auth, - db: config.db, - server: config.server, + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", }), - layout: "layout", + layout: "customer", + schema: { fieldData: ZCustomer }, }); - const param = JSON.stringify({ hello: "world" }); + const resp = await client.find({ query: { name: "test" } }); + const _name = resp.data[0].fieldData.name; + const _phone = resp.data[0].fieldData.phone; + expect(_name).toBeDefined(); + expect(_phone).toBeDefined(); + }); - const resp = await client.executeScript({ - script: "script", - scriptParam: param, + it("client with portal data passed as zod type", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["customer-list"])); + + const client = DataApi({ + adapter: new OttoAdapter({ + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", + }), + layout: "customer", + schema: { fieldData: ZCustomer, portalData: ZCustomerPortals }, }); - expect(resp.scriptResult).toBe("result"); + const data = await client.list(); + const portalField = data.data[0]?.portalData?.PortalTable?.[0]?.["related::related_field"]; + expect(portalField).toBeDefined(); }); }); -describe("container field methods", () => { - it("should upload a file to a container field", async () => { - await containerClient.containerUpload({ - containerFieldName: "myContainer", - file: new Blob([Buffer.from("test/fixtures/test.txt")]), - recordId: "1", - }); +describe("zod transformation", () => { + afterEach(() => { + vi.unstubAllGlobals(); }); - it("should handle container field repetition", async () => { - await containerClient.containerUpload({ - containerFieldName: "repeatingContainer", - containerFieldRepetition: 2, - file: new Blob([Buffer.from("test/fixtures/test.txt")]), - recordId: "1", + it("should return JS-native types when in the zod schema", async () => { + vi.stubGlobal("fetch", createMockFetch(mockResponses["layout-transformation"])); + + const customClient = DataApi({ + adapter: new OttoAdapter({ + auth: { apiKey: "dk_test_api_key" }, + db: "test", + server: "https://api.example.com", + }), + layout: "layout", + schema: { + fieldData: z.object({ + booleanField: z.coerce.boolean(), + CreationTimestamp: z.coerce.date(), + }), + portalData: { + test: z.object({ + "related::related_field": z.string(), + "related::recordId": z.coerce.string(), + }), + }, + }, }); + + const data = await customClient.listAll(); + expect(typeof data[0].fieldData.booleanField).toBe("boolean"); + expect(typeof data[0].fieldData.CreationTimestamp).toBe("object"); + const firstPortalRecord = data[0].portalData.test[0]; + expect(typeof firstPortalRecord["related::related_field"]).toBe("string"); + expect(typeof firstPortalRecord["related::recordId"]).toBe("string"); + expect(firstPortalRecord.recordId).not.toBeUndefined(); + expect(firstPortalRecord.modId).not.toBeUndefined(); }); }); diff --git a/packages/fmdapi/tests/e2e/client-methods.test.ts b/packages/fmdapi/tests/e2e/client-methods.test.ts new file mode 100644 index 00000000..ace9937a --- /dev/null +++ b/packages/fmdapi/tests/e2e/client-methods.test.ts @@ -0,0 +1,334 @@ +import { describe, expect, it, test } from "vitest"; +import { DataApi, OttoAdapter } from "../src"; +import type { AllLayoutsMetadataResponse, Layout, ScriptOrFolder, ScriptsMetadataResponse } from "../src/client-types"; +import { config, containerClient, layoutClient, weirdPortalClient } from "./setup"; + +describe("sort methods", () => { + test("should sort descending", async () => { + const resp = await layoutClient.list({ + sort: { fieldName: "recordId", sortOrder: "descend" }, + }); + expect(resp.data.length).toBe(3); + const firstRecord = Number.parseInt(resp.data[0]?.fieldData.recordId as string, 10); + const secondRecord = Number.parseInt(resp.data[1]?.fieldData.recordId as string, 10); + expect(firstRecord).toBeGreaterThan(secondRecord); + }); + test("should sort ascending by default", async () => { + const resp = await layoutClient.list({ + sort: { fieldName: "recordId" }, + }); + + const firstRecord = Number.parseInt(resp.data[0]?.fieldData.recordId as string, 10); + const secondRecord = Number.parseInt(resp.data[1]?.fieldData.recordId as string, 10); + expect(secondRecord).toBeGreaterThan(firstRecord); + }); +}); + +describe("find methods", () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + test("successful find", async () => { + const resp = await client.find({ + query: { anything: "anything" }, + }); + + expect(Array.isArray(resp.data)).toBe(true); + }); + test("successful findFirst with multiple return", async () => { + const resp = await client.findFirst({ + query: { anything: "anything" }, + }); + expect(Array.isArray(resp.data)).toBe(false); + }); + test("successful findOne", async () => { + const resp = await client.findOne({ + query: { anything: "unique" }, + }); + + expect(Array.isArray(resp.data)).toBe(false); + }); + it("find with omit", async () => { + await layoutClient.find({ + query: { anything: "anything", omit: "true" }, + }); + }); +}); + +describe("portal methods", () => { + it("should return portal data with limit and offset", async () => { + const result = await layoutClient.list({ + limit: 1, + }); + expect(result.data[0]?.portalData?.test?.length).toBe(50); // default portal limit is 50 + + const { data } = await layoutClient.list({ + limit: 1, + portalRanges: { test: { limit: 1, offset: 2 } }, + }); + expect(data.length).toBe(1); + + const portalData = data[0]?.portalData; + const testPortal = portalData?.test; + expect(testPortal?.length).toBe(1); + expect(testPortal?.[0]?.["related::related_field"]).toContain("2"); // we should get the 2nd record + }); + it("should update portal data", async () => { + await layoutClient.update({ + recordId: 1, + fieldData: { anything: "anything" }, + portalData: { + test: [{ "related::related_field": "updated", recordId: "1" }], + }, + }); + }); + it("should handle portal methods with strange names", async () => { + const { data } = await weirdPortalClient.list({ + limit: 1, + portalRanges: { + "long_and_strange.portalName#forTesting": { limit: 100 }, + }, + }); + + expect("long_and_strange.portalName#forTesting" in (data?.[0]?.portalData ?? {})).toBeTruthy(); + + const portalData = data[0]?.portalData["long_and_strange.portalName#forTesting"]; + + expect(portalData?.length).toBeGreaterThan(50); + }); +}); + +describe("other methods", () => { + it("should allow list method without layout param", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + await client.list(); + }); + + it("findOne with 2 results should fail", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + await expect( + client.findOne({ + query: { anything: "anything" }, + }), + ).rejects.toThrow(); + }); + + it("should rename offset param", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + await client.list({ + offset: 0, + }); + }); + + it("should retrieve a list of folders and layouts", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + const resp = (await client.layouts()) as AllLayoutsMetadataResponse; + + expect(Object.hasOwn(resp, "layouts")).toBe(true); + expect(resp.layouts.length).toBeGreaterThanOrEqual(2); + expect(resp.layouts[0] as Layout).toHaveProperty("name"); + const layoutFoler = resp.layouts.find((o) => "isFolder" in o); + expect(layoutFoler).not.toBeUndefined(); + expect(layoutFoler).toHaveProperty("isFolder"); + expect(layoutFoler).toHaveProperty("folderLayoutNames"); + }); + it("should retrieve a list of folders and scripts", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + const resp = (await client.scripts()) as ScriptsMetadataResponse; + + expect(Object.hasOwn(resp, "scripts")).toBe(true); + expect(resp.scripts.length).toBe(3); + expect(resp.scripts[0] as ScriptOrFolder).toHaveProperty("name"); + expect(resp.scripts[1] as ScriptOrFolder).toHaveProperty("isFolder"); + }); + + it("should retrieve layout metadata with only the layout parameter", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + // Call the method with only the required layout parameter + const response = await client.layoutMetadata(); + + // Assertion 1: Ensure the call succeeded and returned a response object + expect(response).toBeDefined(); + expect(response).toBeTypeOf("object"); + + // Assertion 2: Check for the presence of core metadata properties + expect(response).toHaveProperty("fieldMetaData"); + expect(response).toHaveProperty("portalMetaData"); + // valueLists is optional, check type if present + if (response.valueLists) { + expect(Array.isArray(response.valueLists)).toBe(true); + } + + // Assertion 3: Verify the types of the core properties + expect(Array.isArray(response.fieldMetaData)).toBe(true); + expect(typeof response.portalMetaData).toBe("object"); + + // Assertion 4 (Optional but recommended): Check structure of metadata + if (response.fieldMetaData.length > 0) { + expect(response.fieldMetaData[0]).toHaveProperty("name"); + expect(response.fieldMetaData[0]).toHaveProperty("type"); + } + }); + + it("should retrieve layout metadata when layout is configured on the client", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", // Configure layout on the client + }); + + // Call the method without the layout parameter (expecting it to use the client's layout) + // No arguments should be needed when layout is configured on the client. + const response = await client.layoutMetadata(); + + // Assertion 1: Ensure the call succeeded and returned a response object + expect(response).toBeDefined(); + expect(response).toBeTypeOf("object"); + + // Assertion 2: Check for the presence of core metadata properties + expect(response).toHaveProperty("fieldMetaData"); + expect(response).toHaveProperty("portalMetaData"); + // valueLists is optional, check type if present + if (response.valueLists) { + expect(Array.isArray(response.valueLists)).toBe(true); + } + + // Assertion 3: Verify the types of the core properties + expect(Array.isArray(response.fieldMetaData)).toBe(true); + expect(typeof response.portalMetaData).toBe("object"); + + // Assertion 4 (Optional but recommended): Check structure of metadata + if (response.fieldMetaData.length > 0) { + expect(response.fieldMetaData[0]).toHaveProperty("name"); + expect(response.fieldMetaData[0]).toHaveProperty("type"); + } + }); + + it("should paginate through all records", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + const data = await client.listAll({ limit: 1 }); + expect(data.length).toBe(3); + }); + + it("should paginate using findAll method", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + const data = await client.findAll({ + query: { anything: "anything" }, + limit: 1, + }); + + expect(data.length).toBe(2); + }); + + it("should return from execute script", async () => { + const client = DataApi({ + adapter: new OttoAdapter({ + auth: config.auth, + db: config.db, + server: config.server, + }), + layout: "layout", + }); + + const param = JSON.stringify({ hello: "world" }); + + const resp = await client.executeScript({ + script: "script", + scriptParam: param, + }); + + expect(resp.scriptResult).toBe("result"); + }); +}); + +describe("container field methods", () => { + it("should upload a file to a container field", async () => { + await containerClient.containerUpload({ + containerFieldName: "myContainer", + file: new Blob([Buffer.from("test/fixtures/test.txt")]), + recordId: "1", + }); + }); + + it("should handle container field repetition", async () => { + await containerClient.containerUpload({ + containerFieldName: "repeatingContainer", + containerFieldRepetition: 2, + file: new Blob([Buffer.from("test/fixtures/test.txt")]), + recordId: "1", + }); + }); +}); diff --git a/packages/fmdapi/tests/e2e/init-client.test.ts b/packages/fmdapi/tests/e2e/init-client.test.ts new file mode 100644 index 00000000..035afebd --- /dev/null +++ b/packages/fmdapi/tests/e2e/init-client.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, test } from "vitest"; +import { FileMakerError } from "../../src"; +import { client, invalidLayoutClient } from "../setup"; + +describe("client methods (otto 4)", () => { + test("list", async () => { + await client.list(); + }); + test("list with limit param", async () => { + await client.list({ limit: 1 }); + }); + test("missing layout should error", async () => { + await invalidLayoutClient.list().catch((err) => { + expect(err).toBeInstanceOf(FileMakerError); + expect(err.code).toBe("105"); // missing layout error + }); + }); +}); diff --git a/packages/fmdapi/tests/zod.test.ts b/packages/fmdapi/tests/e2e/zod.test.ts similarity index 100% rename from packages/fmdapi/tests/zod.test.ts rename to packages/fmdapi/tests/e2e/zod.test.ts diff --git a/packages/fmdapi/tests/fixtures/responses.ts b/packages/fmdapi/tests/fixtures/responses.ts new file mode 100644 index 00000000..6b07f895 --- /dev/null +++ b/packages/fmdapi/tests/fixtures/responses.ts @@ -0,0 +1,389 @@ +/** + * Mock Response Fixtures + * + * This file contains captured responses from real FileMaker Data API calls. + * These responses are used by the mock fetch implementation to replay API responses + * in tests without requiring a live server connection. + * + * Format: + * - Each response is keyed by a descriptive query name + * - Each response object contains: + * - url: The full request URL (for reference) + * - method: HTTP method + * - status: Response status code + * - response: The actual response data (JSON-parsed) + * + * To add new mock responses: + * 1. Add a query definition to scripts/capture-responses.ts + * 2. Run: pnpm capture + * 3. The captured response will be added to this file automatically + * + * NOTE: This file contains placeholder responses. Run `pnpm capture` to populate + * with real API responses from your FileMaker server. + */ + +export interface MockResponse { + url: string; + method: string; + status: number; + headers?: { + "content-type"?: string; + }; + // biome-ignore lint/suspicious/noExplicitAny: FM API responses vary by endpoint + response: any; +} + +export type MockResponses = Record; + +/** + * Helper to create FM Data API response envelope + */ +function fmResponse(data: unknown[], foundCount?: number) { + const count = foundCount ?? data.length; + return { + messages: [{ code: "0", message: "OK" }], + response: { + data, + dataInfo: { + database: "test", + layout: "layout", + table: "layout", + totalRecordCount: count, + foundCount: count, + returnedCount: data.length, + }, + }, + }; +} + +/** + * Helper to create FM record format + */ +function fmRecord(recordId: number, fieldData: Record, portalData: Record = {}) { + return { + recordId: String(recordId), + modId: "1", + fieldData, + portalData: Object.fromEntries( + Object.entries(portalData).map(([name, records]) => [ + name, + records.map((r, i) => ({ ...r, recordId: String(i + 1), modId: "1" })), + ]), + ), + }; +} + +/** + * Captured mock responses from FileMaker Data API + * + * These are placeholder responses. Run `pnpm capture` to populate with real data. + */ +export const mockResponses = { + "list-basic": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { recordId: "1", anything: "anything" }, { test: [{ "related::related_field": "value1" }] }), + fmRecord(2, { recordId: "2", anything: "anything" }, { test: [{ "related::related_field": "value2" }] }), + fmRecord(3, { recordId: "3", anything: "unique" }, { test: [{ "related::related_field": "value3" }] }), + ]), + }, + + "list-with-limit": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records?_limit=1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse( + [fmRecord(1, { recordId: "1", anything: "anything" }, { test: [{ "related::related_field": "value1" }] })], + 3, + ), + }, + + "list-sorted-descend": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(3, { recordId: "3", anything: "unique" }), + fmRecord(2, { recordId: "2", anything: "anything" }), + fmRecord(1, { recordId: "1", anything: "anything" }), + ]), + }, + + "list-sorted-ascend": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { recordId: "1", anything: "anything" }), + fmRecord(2, { recordId: "2", anything: "anything" }), + fmRecord(3, { recordId: "3", anything: "unique" }), + ]), + }, + + "list-with-portal-data": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records?_limit=1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord( + 1, + { recordId: "1", anything: "anything" }, + { + test: Array.from({ length: 50 }, (_, i) => ({ + "related::related_field": `value${i + 1}`, + })), + }, + ), + ]), + }, + + "list-with-portal-ranges": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records?_limit=1&_limit.test=1&_offset.test=2", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { recordId: "1", anything: "anything" }, { test: [{ "related::related_field": "value2" }] }), + ]), + }, + + "find-basic": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/_find", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { recordId: "1", anything: "anything" }), + fmRecord(2, { recordId: "2", anything: "anything" }), + ]), + }, + + "find-unique": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/_find", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([fmRecord(3, { recordId: "3", anything: "unique" })]), + }, + + "find-no-results": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/_find", + method: "POST", + status: 400, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "401", message: "No records match the request" }], + response: {}, + }, + }, + + "get-record": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records/1", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([fmRecord(1, { recordId: "1", anything: "anything" })]), + }, + + "layout-metadata": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + fieldMetaData: [ + { name: "recordId", type: "normal", displayType: "editText", result: "text" }, + { name: "anything", type: "normal", displayType: "editText", result: "text" }, + ], + portalMetaData: { + test: [{ name: "related::related_field", type: "normal", displayType: "editText", result: "text" }], + }, + }, + }, + }, + + "all-layouts": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + layouts: [ + { name: "layout" }, + { name: "customer" }, + { isFolder: true, folderLayoutNames: [{ name: "nested_layout" }] }, + ], + }, + }, + }, + + "all-scripts": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/scripts", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + scripts: [ + { name: "script" }, + { isFolder: true, folderScriptNames: [{ name: "nested_script" }] }, + { name: "script2" }, + ], + }, + }, + }, + + "execute-script": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/script/script", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + scriptResult: "result", + scriptError: "0", + }, + }, + }, + + "error-missing-layout": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/not_a_layout/records", + method: "GET", + status: 500, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "105", message: "Layout is missing" }], + response: {}, + }, + }, + + "update-success": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records/1", + method: "PATCH", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + modId: "2", + }, + }, + }, + + "create-success": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + recordId: "4", + modId: "1", + }, + }, + }, + + "delete-success": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records/1", + method: "DELETE", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: {}, + }, + }, + + "container-upload-success": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/container/records/1/containers/myContainer", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + modId: "2", + }, + }, + }, + + "customer-list": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/customer/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { name: "John", phone: "555-1234" }, { PortalTable: [{ "related::related_field": "portal1" }] }), + fmRecord(2, { name: "Jane", phone: "555-5678" }, { PortalTable: [{ "related::related_field": "portal2" }] }), + ]), + }, + + "customer-find": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/customer/_find", + method: "POST", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord(1, { name: "test", phone: "555-1234" }, { PortalTable: [{ "related::related_field": "portal1" }] }), + ]), + }, + + "customer-fields-missing": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/customer_fieldsMissing/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([fmRecord(1, { name: "John" })]), // missing phone field + }, + + "layout-transformation": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/layout/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord( + 1, + { booleanField: "1", CreationTimestamp: "01/01/2024 12:00:00" }, + { + test: [ + { "related::related_field": "value1", "related::recordId": 100 }, + { "related::related_field": "value2", "related::recordId": 200 }, + ], + }, + ), + ]), + }, + + "weird-portals-list": { + url: "https://api.example.com/otto/fmi/data/vLatest/databases/test/layouts/Weird%20Portals/records", + method: "GET", + status: 200, + headers: { "content-type": "application/json" }, + response: fmResponse([ + fmRecord( + 1, + { recordId: "1" }, + { + "long_and_strange.portalName#forTesting": Array.from({ length: 60 }, (_, i) => ({ + "related::field": `value${i + 1}`, + })), + }, + ), + ]), + }, +} satisfies MockResponses; diff --git a/packages/fmdapi/tests/init-client.test.ts b/packages/fmdapi/tests/init-client.test.ts index 13ecb3b6..86d5a550 100644 --- a/packages/fmdapi/tests/init-client.test.ts +++ b/packages/fmdapi/tests/init-client.test.ts @@ -1,7 +1,6 @@ import { describe, expect, test } from "vitest"; -import { DataApi, FetchAdapter, FileMakerError, OttoAdapter } from "../src"; +import { DataApi, FetchAdapter, OttoAdapter } from "../src"; import memoryStore from "../src/tokenStore/memory"; -import { client, invalidLayoutClient } from "./setup"; describe("try to init client", () => { test("without server", () => { @@ -122,18 +121,3 @@ describe("try to init client", () => { expect(client.baseUrl.toString()).toContain("/otto/"); }); }); - -describe("client methods (otto 4)", () => { - test("list", async () => { - await client.list(); - }); - test("list with limit param", async () => { - await client.list({ limit: 1 }); - }); - test("missing layout should error", async () => { - await invalidLayoutClient.list().catch((err) => { - expect(err).toBeInstanceOf(FileMakerError); - expect(err.code).toBe("105"); // missing layout error - }); - }); -}); diff --git a/packages/fmdapi/tests/setup.ts b/packages/fmdapi/tests/setup.ts index 18b32901..63ad775b 100644 --- a/packages/fmdapi/tests/setup.ts +++ b/packages/fmdapi/tests/setup.ts @@ -1,9 +1,6 @@ -import dotenv from "dotenv"; import type { OttoFMSAPIKey } from "../src/adapters/otto"; import { DataApi, FetchAdapter, OttoAdapter } from "../src/index"; -dotenv.config({ path: ".env.local" }); - if (!(process.env.FM_SERVER && process.env.FM_DATABASE && process.env.OTTO_API_KEY)) { throw new Error("FM_SERVER, FM_DATABASE, and OTTO_API_KEY must be set in the environment"); } diff --git a/packages/fmdapi/tests/utils/mock-fetch.ts b/packages/fmdapi/tests/utils/mock-fetch.ts new file mode 100644 index 00000000..a28a8a54 --- /dev/null +++ b/packages/fmdapi/tests/utils/mock-fetch.ts @@ -0,0 +1,180 @@ +/** + * Mock Fetch Utility + * + * This utility creates a mock fetch function that returns pre-recorded API responses. + * It's designed to be used with vitest's vi.stubGlobal to mock the global fetch. + * + * Usage: + * ```ts + * import { vi } from 'vitest'; + * import { createMockFetch, createMockFetchSequence } from './tests/utils/mock-fetch'; + * import { mockResponses } from './tests/fixtures/responses'; + * + * // Mock a single response + * vi.stubGlobal('fetch', createMockFetch(mockResponses['list-basic'])); + * + * // Mock a sequence of responses (for multi-call tests) + * vi.stubGlobal('fetch', createMockFetchSequence([ + * mockResponses['list-basic'], + * mockResponses['find-basic'], + * ])); + * ``` + * + * Benefits: + * - Each test explicitly declares which response it expects + * - No URL matching logic needed - the response is used directly + * - Tests are more robust and easier to understand + * - Supports both full MockResponse objects and simple data + */ + +import type { MockResponse } from "../fixtures/responses"; + +/** + * Creates a mock fetch function that returns the provided response + * + * @param response - A MockResponse object with the response data + * @returns A fetch-compatible function that returns the mocked response + */ +export function createMockFetch(response: MockResponse): typeof fetch { + return (_input: RequestInfo | URL, _init?: RequestInit): Promise => { + const contentType = response.headers?.["content-type"] || "application/json"; + const isJson = contentType.includes("application/json"); + + const headers = new Headers({ + "content-type": contentType, + }); + + if (response.headers) { + for (const [key, value] of Object.entries(response.headers)) { + if (key !== "content-type" && value) { + headers.set(key, value); + } + } + } + + // Format response body based on content type + const responseBody = isJson ? JSON.stringify(response.response) : String(response.response); + + return Promise.resolve( + new Response(responseBody, { + status: response.status, + statusText: response.status >= 200 && response.status < 300 ? "OK" : "Error", + headers, + }), + ); + }; +} + +/** + * Creates a mock fetch function that returns responses in sequence + * Useful for tests that make multiple API calls + * + * @param responses - Array of MockResponse objects to return in order + * @returns A fetch-compatible function that returns responses sequentially + */ +export function createMockFetchSequence(responses: MockResponse[]): typeof fetch { + let callIndex = 0; + + return (_input: RequestInfo | URL, _init?: RequestInit): Promise => { + const response = responses[callIndex]; + if (!response) { + throw new Error( + `Mock fetch called more times than expected. Call #${callIndex + 1}, but only ${responses.length} responses provided.`, + ); + } + callIndex++; + + const contentType = response.headers?.["content-type"] || "application/json"; + const isJson = contentType.includes("application/json"); + + const headers = new Headers({ + "content-type": contentType, + }); + + if (response.headers) { + for (const [key, value] of Object.entries(response.headers)) { + if (key !== "content-type" && value) { + headers.set(key, value); + } + } + } + + const responseBody = isJson ? JSON.stringify(response.response) : String(response.response); + + return Promise.resolve( + new Response(responseBody, { + status: response.status, + statusText: response.status >= 200 && response.status < 300 ? "OK" : "Error", + headers, + }), + ); + }; +} + +/** + * Helper to create a simple mock response + */ +export interface SimpleMockConfig { + status: number; + body?: unknown; + headers?: Record; +} + +export function simpleMock(config: SimpleMockConfig): typeof fetch { + return createMockFetch({ + url: "https://api.example.com/mock", + method: "GET", + status: config.status, + response: config.body ?? null, + headers: { + "content-type": "application/json", + ...config.headers, + }, + }); +} + +/** + * Creates a FileMaker-style error response + */ +export function createFMErrorMock(code: string, message: string): typeof fetch { + return createMockFetch({ + url: "https://api.example.com/mock", + method: "GET", + status: code === "401" ? 400 : 500, + response: { + messages: [{ code, message }], + response: {}, + }, + headers: { + "content-type": "application/json", + }, + }); +} + +/** + * Creates a successful FileMaker Data API response + */ +export function createFMSuccessMock(data: unknown[]): typeof fetch { + return createMockFetch({ + url: "https://api.example.com/mock", + method: "GET", + status: 200, + response: { + messages: [{ code: "0", message: "OK" }], + response: { + data, + dataInfo: { + database: "test", + layout: "test", + table: "test", + totalRecordCount: data.length, + foundCount: data.length, + returnedCount: data.length, + }, + }, + }, + headers: { + "content-type": "application/json", + }, + }); +} diff --git a/packages/fmdapi/tests/utils/mock-server-url.ts b/packages/fmdapi/tests/utils/mock-server-url.ts new file mode 100644 index 00000000..18bcacb4 --- /dev/null +++ b/packages/fmdapi/tests/utils/mock-server-url.ts @@ -0,0 +1,8 @@ +/** + * Mock Server URL Constant + * + * This constant defines the mock server URL used in test fixtures. + * All captured responses have their server URLs replaced with this value + * to avoid storing actual test server names in the codebase. + */ +export const MOCK_SERVER_URL = "api.example.com"; diff --git a/packages/fmdapi/vitest.config.ts b/packages/fmdapi/vitest.config.ts index 8d7d7f61..6da8974a 100644 --- a/packages/fmdapi/vitest.config.ts +++ b/packages/fmdapi/vitest.config.ts @@ -3,5 +3,10 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { testTimeout: 15_000, // 15 seconds, since we're making a network call to FM + exclude: [ + "**/node_modules/**", + "**/dist/**", + "tests/e2e/**", // E2E tests require live FM server, run separately with test:e2e + ], }, }); diff --git a/packages/fmodata/README.md b/packages/fmodata/README.md index 2d742318..e4dc178a 100644 --- a/packages/fmodata/README.md +++ b/packages/fmodata/README.md @@ -2,7 +2,7 @@ A strongly-typed FileMaker OData API client. -⚠️ WARNING: This library is in "alpha" status. It's still in active development and the API is subject to change. Feedback is welcome on the [community forum](https://community.ottomatic.cloud/c/proofkit/13) or on [GitHub](https://github.com/proofgeist/proofkit/issues). +⚠️ This library is in **beta** status. The core API is stable but may still see minor changes before 1.0. Feedback is welcome on the [community forum](https://community.ottomatic.cloud/c/proofkit/13) or on [GitHub](https://github.com/proofgeist/proofkit/issues). Roadmap: @@ -10,13 +10,13 @@ Roadmap: - [x] Batch operations - [ ] Automatically chunk requests into smaller batches (e.g. max 512 inserts per batch) - [x] Schema updates (add/update tables and fields) -- [ ] Proper docs at proofkit.dev -- [ ] @proofkit/typegen integration +- [x] Proper docs at proofkit.dev +- [x] @proofkit/typegen integration ## Installation ```bash -pnpm add @proofkit/fmodata@alpha +pnpm add @proofkit/fmodata@beta ``` ## Quick Start diff --git a/packages/fmodata/op.env b/packages/fmodata/op.env deleted file mode 100644 index 09dca379..00000000 --- a/packages/fmodata/op.env +++ /dev/null @@ -1,15 +0,0 @@ -# __ _____ _ -# /_ | __ \ | | -# | | |__) |_ _ ___ _____ _____ _ __ __| | ___ _ ____ __ -# | | ___/ _` / __/ __\ \ /\ / / _ \| '__/ _` | / _ \ '_ \ \ / / -# | | | | (_| \__ \__ \\ V V / (_) | | | (_| || __/ | | \ V / -# |_|_| \__,_|___/___/ \_/\_/ \___/|_| \__,_(_)___|_| |_|\_/ -# -# This file is intentionally commited to source control. -# It should only reference secrets in 1Password - -FMODATA_SERVER_URL="op://xrs5sehh2gm36me62rlfpmsyde/fmdapi_test/1Password env Values/FM_SERVER" -FMODATA_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/fmdapi_test/1Password env Values/FM_DATABASE" -FMODATA_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/fmdapi_test/1Password env Values/OTTO_API_KEY" -FMODATA_USERNAME="op://xrs5sehh2gm36me62rlfpmsyde/fmdapi_test/username" -FMODATA_PASSWORD="op://xrs5sehh2gm36me62rlfpmsyde/fmdapi_test/password" \ No newline at end of file diff --git a/packages/fmodata/package.json b/packages/fmodata/package.json index 6f9decee..e6d92fbb 100644 --- a/packages/fmodata/package.json +++ b/packages/fmodata/package.json @@ -21,30 +21,27 @@ "scripts": { "build": "tsc && vite build && publint --strict", "build:watch": "tsc && vite build --watch", - "check-format": "biome format --check .", - "format": "biome format --write .", "lint": "biome check . --write", "lint:summary": "biome check . --reporter=summary", - "lint:fix": "pnpm lint --fix", "dev": "tsc --watch", "test": "vitest run --typecheck", - "tsc": "tsc --noEmit", + "typecheck": "tsc --noEmit", "test:typecheck": "vitest run --typecheck", "test:watch": "vitest --typecheck", "test:build": "pnpm build && TEST_BUILD=true vitest run --typecheck", "test:watch:build": "TEST_BUILD=true vitest --typecheck", - "test:e2e": "op inject -i op.env -o .env.local -f && vitest run tests/e2e.test.ts", - "capture": "op inject -i op.env -o .env.local -f && tsx scripts/capture-responses.ts", + "test:e2e": "doppler run -- vitest run tests/e2e", + "capture": "doppler run -- tsx scripts/capture-responses.ts", "knip": "knip", "pub:alpha": "bun run scripts/publish-alpha.ts", "global:link": "pnpm link --global" }, "dependencies": { "@fetchkit/ffetch": "^4.2.0", - "dotenv": "^16.5.0", - "es-toolkit": "^1.38.0", + "dotenv": "^16.6.1", + "es-toolkit": "^1.43.0", "neverthrow": "^8.2.0", - "odata-query": "^8.0.4" + "odata-query": "^8.0.7" }, "peerDependencies": { "zod": ">=4.0.0" @@ -55,17 +52,17 @@ } }, "devDependencies": { - "@standard-schema/spec": "^1.0.0", - "@tanstack/vite-config": "^0.2.0", - "@types/node": "^22.17.1", - "fast-xml-parser": "^5.3.2", + "@standard-schema/spec": "^1.1.0", + "@tanstack/vite-config": "^0.2.1", + "@types/node": "^22.19.5", + "fast-xml-parser": "^5.3.3", "publint": "^0.3.16", - "tsx": "^4.19.2", + "tsx": "^4.21.0", "typescript": "^5.9.3", - "vite": "^6.3.4", + "vite": "^6.4.1", "vite-plugin-dts": "^4.5.4", - "vitest": "^4.0.7", - "zod": "^4.2.0" + "vitest": "^4.0.17", + "zod": "^4.3.5" }, "engines": { "node": ">=18.0.0" diff --git a/packages/fmodata/tests/e2e.test.ts b/packages/fmodata/tests/e2e/e2e.test.ts similarity index 99% rename from packages/fmodata/tests/e2e.test.ts rename to packages/fmodata/tests/e2e/e2e.test.ts index 96a48318..2e8b6cba 100644 --- a/packages/fmodata/tests/e2e.test.ts +++ b/packages/fmodata/tests/e2e/e2e.test.ts @@ -16,10 +16,10 @@ import { } from "@proofkit/fmodata"; import { afterEach, assert, describe, expect, expectTypeOf, it } from "vitest"; import { z } from "zod/v4"; -import { apiKey, contacts, contactsTOWithIds, database, password, serverUrl, username, users } from "./e2e/setup"; -import { mockResponses } from "./fixtures/responses"; -import { jsonCodec } from "./utils/helpers"; -import { createMockFetch, simpleMock } from "./utils/mock-fetch"; +import { mockResponses } from "../fixtures/responses"; +import { jsonCodec } from "../utils/helpers"; +import { createMockFetch, simpleMock } from "../utils/mock-fetch"; +import { apiKey, contacts, contactsTOWithIds, database, password, serverUrl, username, users } from "./setup"; if (!serverUrl) { throw new Error("FMODATA_SERVER_URL environment variable is required"); diff --git a/packages/fmodata/tests/schema-manager.test.ts b/packages/fmodata/tests/e2e/schema-manager.test.ts similarity index 99% rename from packages/fmodata/tests/schema-manager.test.ts rename to packages/fmodata/tests/e2e/schema-manager.test.ts index dd37bd43..6bbbd40e 100644 --- a/packages/fmodata/tests/schema-manager.test.ts +++ b/packages/fmodata/tests/e2e/schema-manager.test.ts @@ -28,7 +28,7 @@ import { FMServerConnection } from "@proofkit/fmodata"; import { config } from "dotenv"; import { afterEach, describe, expect, it } from "vitest"; -config({ path: path.resolve(__dirname, "../.env.local") }); +config({ path: path.resolve(__dirname, "../../.env.local") }); // Load environment variables const serverUrl = process.env.FMODATA_SERVER_URL; diff --git a/packages/fmodata/tests/e2e/setup.ts b/packages/fmodata/tests/e2e/setup.ts index 999b9866..563b3303 100644 --- a/packages/fmodata/tests/e2e/setup.ts +++ b/packages/fmodata/tests/e2e/setup.ts @@ -5,13 +5,9 @@ * used across all E2E test files. */ -import path from "node:path"; import { fmTableOccurrence, textField, timestampField } from "@proofkit/fmodata"; -import { config } from "dotenv"; import { z } from "zod/v4"; -config({ path: path.resolve(__dirname, "../../.env.local") }); - // Load environment variables export const serverUrl = process.env.FMODATA_SERVER_URL; export const apiKey = process.env.FMODATA_API_KEY; diff --git a/packages/registry/lib/types.ts b/packages/registry/lib/types.ts index 0f26f9f8..4e03a335 100644 --- a/packages/registry/lib/types.ts +++ b/packages/registry/lib/types.ts @@ -1,4 +1,3 @@ -import { registryItemSchema, type RegistryItem as ShadcnRegistryItem } from "shadcn/registry"; import { z } from "zod/v3"; const registryTypeSchema = z @@ -20,6 +19,66 @@ const registryTypeSchema = z "The type property is used to specify the type of your registry item. This is used to determine the type and target path of the item when resolved for a project.", ); +type RegistryType = z.infer; + +/** + * Minimal file schema for shadcn CLI compatibility. + * This matches the structure expected by shadcn but avoids importing heavy types. + */ +const registryItemFileSchema = z.discriminatedUnion("type", [ + z.object({ + path: z.string(), + content: z.string().optional(), + type: registryTypeSchema.extract(["registry:file", "registry:page"]), + target: z.string(), + }), + z.object({ + path: z.string(), + content: z.string().optional(), + type: registryTypeSchema.exclude(["registry:file", "registry:page"]), + target: z.string().optional(), + }), +]); + +/** + * Base schema with common fields from shadcn's registryItemSchema. + * We define our own to avoid importing the heavy shadcn types. + */ +const baseRegistryItemSchema = z.object({ + $schema: z.string().optional(), + extends: z.string().optional(), + title: z.string().optional(), + author: z.string().optional(), + description: z.string().optional(), + dependencies: z.array(z.string()).optional(), + devDependencies: z.array(z.string()).optional(), + registryDependencies: z.array(z.string()).optional(), + tailwind: z + .object({ + config: z + .object({ + content: z.array(z.string()).optional(), + theme: z.record(z.string(), z.any()).optional(), + plugins: z.array(z.string()).optional(), + }) + .optional(), + }) + .optional(), + cssVars: z + .object({ + theme: z.record(z.string(), z.string()).optional(), + light: z.record(z.string(), z.string()).optional(), + dark: z.record(z.string(), z.string()).optional(), + }) + .optional(), + css: z.record(z.string(), z.any()).optional(), + envVars: z.record(z.string(), z.string()).optional(), + meta: z.record(z.string(), z.any()).optional(), + categories: z.array(z.string()).optional(), +}); + +type BaseRegistryItem = z.infer; + // Defines a single file within a template export const templateFileSchema = z.discriminatedUnion("type", [ z.object({ @@ -116,12 +175,12 @@ const categorySchema = z.enum(["component", "page", "utility", "hook", "email"]) export const frameworkSchema = z.enum(["next-pages", "next-app", "manual"]); -export type TemplateMetadata = z.infer & { +export type TemplateMetadata = BaseRegistryItem & { title: string; description?: string; category: z.infer; files: TemplateFile[]; - registryType: z.infer; + registryType: RegistryType; postInstall?: PostInstallStep[]; minimumProofKitVersion?: string; allowedFrameworks?: z.infer[]; @@ -129,25 +188,23 @@ export type TemplateMetadata = z.infer & { }; // Defines the metadata for a single template (_meta.ts) -export const templateMetadataSchema: z.ZodType = registryItemSchema - .omit({ name: true, type: true, files: true, docs: true }) - .extend({ - title: z.string(), - description: z.string().optional(), - category: categorySchema, - files: z.array(templateFileSchema), - registryType: registryTypeSchema, - postInstall: z - .array(postInstallStepsSchema) - .optional() - .describe("Steps that should be run by the ProofKit CLI after shadcn CLI is done"), - minimumProofKitVersion: z - .string() - .describe("The minimum version of ProofKit required to use this template") - .optional(), - allowedFrameworks: z.array(frameworkSchema).optional(), - schemaRequired: z.boolean().optional().describe("Whether this template requires a database schema to be selected"), - }); +export const templateMetadataSchema: z.ZodType = baseRegistryItemSchema.extend({ + title: z.string(), + description: z.string().optional(), + category: categorySchema, + files: z.array(templateFileSchema), + registryType: registryTypeSchema, + postInstall: z + .array(postInstallStepsSchema) + .optional() + .describe("Steps that should be run by the ProofKit CLI after shadcn CLI is done"), + minimumProofKitVersion: z + .string() + .describe("The minimum version of ProofKit required to use this template") + .optional(), + allowedFrameworks: z.array(frameworkSchema).optional(), + schemaRequired: z.boolean().optional().describe("Whether this template requires a database schema to be selected"), +}); export type TemplateFile = z.infer; @@ -158,11 +215,22 @@ export type RegistryIndex = Array<{ description?: string; }>; -export const registryIndexSchema: z.ZodType = templateMetadataSchema - .pick({ title: true, category: true, description: true }) - .extend({ +export const registryIndexSchema: z.ZodType = z + .object({ name: z.string(), + title: z.string(), + category: categorySchema, + description: z.string().optional(), }) .array(); -export type RegistryItem = ShadcnRegistryItem; +/** + * Output type compatible with shadcn CLI's RegistryItem. + * Defined locally to avoid importing heavy shadcn types. + */ +export type RegistryItem = BaseRegistryItem & { + name: string; + type: RegistryType; + files?: z.infer[]; + docs?: string; +}; diff --git a/packages/registry/package.json b/packages/registry/package.json index ffe7fa6f..c04957d8 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -30,7 +30,8 @@ "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", - "lint": "biome check .", + "typecheck": "tsc --noEmit", + "lint": "biome check . --write", "lint:summary": "biome check . --reporter=summary" }, "keywords": [ @@ -42,18 +43,17 @@ "license": "ISC", "packageManager": "pnpm@10.14.0", "devDependencies": { - "@vitest/coverage-v8": "^2.1.8", + "@vitest/coverage-v8": "^2.1.9", "chokidar-cli": "^3.0.0", "concurrently": "^8.2.2", "publint": "^0.3.16", "tsdown": "^0.14.2", - "tsx": "^4.19.2", + "tsx": "^4.21.0", "typescript": "^5.9.3", - "vitest": "^4.0.7" + "vitest": "^4.0.17" }, "dependencies": { "jiti": "^1.21.7", - "shadcn": "^2.10.0", - "zod": "^4.2.0" + "zod": "^4.3.5" } } diff --git a/packages/typegen/CHANGELOG.md b/packages/typegen/CHANGELOG.md index b58465be..f0d643e2 100644 --- a/packages/typegen/CHANGELOG.md +++ b/packages/typegen/CHANGELOG.md @@ -1,5 +1,13 @@ # @proofkit/typegen +## 1.1.0-beta.5 + +### Patch Changes + +- ae07372: Fix post-generate command to run once after all configs instead of once per config. +- 23639ec: Fix generated client authentication type detection to use OttoAdapter when OTTO_API_KEY environment variable is set with default names +- dfe52a7: Fix boolean transformations in odata + ## 1.1.0-beta.4 ### Minor Changes diff --git a/packages/typegen/op.env b/packages/typegen/op.env deleted file mode 100644 index fea92cfb..00000000 --- a/packages/typegen/op.env +++ /dev/null @@ -1,26 +0,0 @@ -# __ _____ _ -# /_ | __ \ | | -# | | |__) |_ _ ___ _____ _____ _ __ __| | ___ _ ____ __ -# | | ___/ _` / __/ __\ \ /\ / / _ \| '__/ _` | / _ \ '_ \ \ / / -# | | | | (_| \__ \__ \\ V V / (_) | | | (_| || __/ | | \ V / -# |_|_| \__,_|___/___/ \_/\_/ \___/|_| \__,_(_)___|_| |_|\_/ -# -# This file is intentionally commited to source control. -# It should only reference secrets in 1Password - -DIFFERENT_FM_SERVER="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_SERVER" -DIFFERENT_FM_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_DATABASE" -DIFFERENT_OTTO_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/OTTO_API_KEY" - -FM_SERVER="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_SERVER" -FM_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_DATABASE" -OTTO_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/OTTO_API_KEY" -FM_USERNAME="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/username" -FM_PASSWORD="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/password" - -# Test environment variables -TEST_FM_SERVER="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_SERVER" -TEST_FM_DATABASE="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/FM_DATABASE" -TEST_OTTO_API_KEY="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/1Password env Values/OTTO_API_KEY" -TEST_USERNAME="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/username" -TEST_PASSWORD="op://xrs5sehh2gm36me62rlfpmsyde/ztcjgvgc4i5aa6cjh5vudpco4m/password" diff --git a/packages/typegen/package.json b/packages/typegen/package.json index 704b9d1c..2ccc9022 100644 --- a/packages/typegen/package.json +++ b/packages/typegen/package.json @@ -1,6 +1,6 @@ { "name": "@proofkit/typegen", - "version": "1.1.0-beta.4", + "version": "1.1.0-beta.5", "description": "", "type": "module", "main": "dist/esm/index.js", @@ -10,7 +10,8 @@ "dev:api": "concurrently -n \"build,server\" -c \"cyan,magenta\" \"pnpm build:watch\" \"nodemon --watch dist/esm --delay 1 --exec 'node dist/esm/cli.js ui --port 3141 --no-open'\"", "test": "vitest run", "test:watch": "vitest --watch", - "setup-env": "op inject -i op.env -o .env.local -f", + "test:e2e": "doppler run -- vitest run tests/e2e", + "typecheck": "tsc --noEmit", "build": "pnpm -C web build && pnpm vite build && node scripts/build-copy.js && publint --strict", "build:watch": "vite build --watch", "ci": "pnpm run build && pnpm run test", @@ -65,35 +66,35 @@ "dependencies": { "@clack/prompts": "^0.11.0", "@commander-js/extra-typings": "^14.0.0", - "@hono/node-server": "^1.19.7", - "@hono/zod-validator": "^0.7.5", + "@hono/node-server": "^1.19.8", + "@hono/zod-validator": "^0.7.6", "@proofkit/fmdapi": "workspace:*", "@proofkit/fmodata": "workspace:*", - "@tanstack/vite-config": "^0.2.0", + "@tanstack/vite-config": "^0.2.1", "chalk": "5.4.1", - "commander": "^14.0.0", - "dotenv": "^16.5.0", - "execa": "^9.5.3", - "fast-xml-parser": "^5.3.2", - "fs-extra": "^11.3.0", - "hono": "^4.9.0", + "commander": "^14.0.2", + "dotenv": "^16.6.1", + "execa": "^9.6.1", + "fast-xml-parser": "^5.3.3", + "fs-extra": "^11.3.3", + "hono": "^4.11.3", "jsonc-parser": "^3.3.1", - "open": "^10.1.0", + "open": "^10.2.0", "prettier": "^3.7.4", - "semver": "^7.7.2", + "semver": "^7.7.3", "ts-morph": "^26.0.0", "ts-toolbelt": "^9.6.0", - "vite": "^6.3.4", - "zod": "^4.2.0" + "vite": "^6.4.1", + "zod": "^4.3.5" }, "devDependencies": { "@types/fs-extra": "^11.0.4", - "@types/semver": "^7.7.0", + "@types/semver": "^7.7.1", "concurrently": "^8.2.2", "nodemon": "^3.1.11", "publint": "^0.3.16", "type-fest": "^3.13.1", "typescript": "^5.9.3", - "vitest": "^4.0.7" + "vitest": "^4.0.17" } } diff --git a/packages/typegen/src/typegen.ts b/packages/typegen/src/typegen.ts index 831fae60..a135d4dc 100644 --- a/packages/typegen/src/typegen.ts +++ b/packages/typegen/src/typegen.ts @@ -181,23 +181,38 @@ const generateTypedClientsSingle = async ( strictNumbers: item.strictNumbers, webviewerScriptName: config?.type === "fmdapi" ? config.webviewerScriptName : undefined, envNames: (() => { - const hasApiKey = envNames?.auth?.apiKey !== undefined; - const hasUsername = envNames?.auth?.username !== undefined; + // Determine the intended auth type based on config AND runtime. + // Priority: + // 1. If user explicitly specified apiKey in config β†’ use OttoAdapter + // 2. If user explicitly specified username in config β†’ use FetchAdapter + // 3. If neither specified (defaults) β†’ use what was actually used at runtime + // + // Note: We check for the VALUE being defined, not just the property existing, + // because the Zod schema defines both apiKey and username as optional properties, + // so both exist on the object but with undefined values when not specified. + const configHasApiKey = envNames?.auth?.apiKey !== undefined; + const configHasUsername = envNames?.auth?.username !== undefined; + const runtimeUsedApiKey = "apiKey" in auth; + + // Use apiKey if: explicitly specified in config, OR not explicitly set to username AND runtime used apiKey + const useApiKey = configHasApiKey || (!configHasUsername && runtimeUsedApiKey); + + // Determine the env var names to use in generated code + const apiKeyEnvName = envNames?.auth?.apiKey ?? defaultEnvNames.apiKey; + const usernameEnvName = envNames?.auth?.username ?? defaultEnvNames.username; + const passwordEnvName = envNames?.auth?.password ?? defaultEnvNames.password; return { - auth: hasApiKey + auth: useApiKey ? { - apiKey: envNames?.auth?.apiKey ?? defaultEnvNames.apiKey, + apiKey: apiKeyEnvName, username: undefined, password: undefined, } : { apiKey: undefined, - username: hasUsername && envNames?.auth ? envNames.auth.username : defaultEnvNames.username, - password: - hasUsername && envNames?.auth && envNames.auth.password !== undefined - ? envNames.auth.password - : defaultEnvNames.password, + username: usernameEnvName, + password: passwordEnvName, }, db: envNames?.db ?? defaultEnvNames.db, server: envNames?.server ?? defaultEnvNames.server, diff --git a/packages/typegen/tests/fmodata-preserve-customizations.test.ts b/packages/typegen/tests/e2e/fmodata-preserve-customizations.test.ts similarity index 97% rename from packages/typegen/tests/fmodata-preserve-customizations.test.ts rename to packages/typegen/tests/e2e/fmodata-preserve-customizations.test.ts index f1db8e58..0990d289 100644 --- a/packages/typegen/tests/fmodata-preserve-customizations.test.ts +++ b/packages/typegen/tests/e2e/fmodata-preserve-customizations.test.ts @@ -2,8 +2,8 @@ import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { describe, expect, it } from "vitest"; -import { generateODataTypes } from "../src/fmodata/generateODataTypes"; -import type { ParsedMetadata } from "../src/fmodata/parseMetadata"; +import { generateODataTypes } from "../../src/fmodata/generateODataTypes"; +import type { ParsedMetadata } from "../../src/fmodata/parseMetadata"; function makeMetadata({ entitySetName, diff --git a/packages/typegen/tests/fmodata-typegen.test.ts b/packages/typegen/tests/e2e/fmodata-typegen.test.ts similarity index 97% rename from packages/typegen/tests/fmodata-typegen.test.ts rename to packages/typegen/tests/e2e/fmodata-typegen.test.ts index 42f2493f..b70e96f9 100644 --- a/packages/typegen/tests/fmodata-typegen.test.ts +++ b/packages/typegen/tests/e2e/fmodata-typegen.test.ts @@ -2,11 +2,11 @@ import { execSync } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { generateODataTypes, parseMetadataFromFile } from "../src/fmodata"; -import type { FmodataConfig } from "../src/types"; +import { generateODataTypes, parseMetadataFromFile } from "../../src/fmodata"; +import type { FmodataConfig } from "../../src/types"; // Helper to read fixture files -const fixturesDir = path.resolve(__dirname, "fixtures"); +const fixturesDir = path.resolve(__dirname, "../fixtures"); const outputDir = path.resolve(__dirname, "fmodata-output"); /** @@ -438,7 +438,7 @@ describe("fmodata typegen - snapshot tests", () => { await generateODataTypes(metadata, config); const content = await fs.readFile(path.join(outputDir, "Customers.ts"), "utf-8"); - await expect(content).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", "fmodata-customers.snap.ts")); + await expect(content).toMatchFileSnapshot(path.join(__dirname, "../__snapshots__", "fmodata-customers.snap.ts")); }); it("generates expected Orders table output", async () => { @@ -455,7 +455,7 @@ describe("fmodata typegen - snapshot tests", () => { await generateODataTypes(metadata, config); const content = await fs.readFile(path.join(outputDir, "Orders.ts"), "utf-8"); - await expect(content).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", "fmodata-orders.snap.ts")); + await expect(content).toMatchFileSnapshot(path.join(__dirname, "../__snapshots__", "fmodata-orders.snap.ts")); }); it("generates expected index file output", async () => { @@ -472,7 +472,7 @@ describe("fmodata typegen - snapshot tests", () => { await generateODataTypes(metadata, config); const content = await fs.readFile(path.join(outputDir, "index.ts"), "utf-8"); - await expect(content).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", "fmodata-index.snap.ts")); + await expect(content).toMatchFileSnapshot(path.join(__dirname, "../__snapshots__", "fmodata-index.snap.ts")); }); it("generates expected output with all typeOverride transformations", async () => { @@ -502,6 +502,8 @@ describe("fmodata typegen - snapshot tests", () => { await generateODataTypes(metadata, config); const content = await fs.readFile(path.join(outputDir, "Customers.ts"), "utf-8"); - await expect(content).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", "fmodata-type-overrides.snap.ts")); + await expect(content).toMatchFileSnapshot( + path.join(__dirname, "../__snapshots__", "fmodata-type-overrides.snap.ts"), + ); }); }); diff --git a/packages/typegen/tests/e2e/typegen.test.ts b/packages/typegen/tests/e2e/typegen.test.ts new file mode 100644 index 00000000..e22ceb79 --- /dev/null +++ b/packages/typegen/tests/e2e/typegen.test.ts @@ -0,0 +1,389 @@ +import { execSync } from "node:child_process"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { afterEach, beforeEach, describe, expect, it } from "vitest"; +import type { z } from "zod/v4"; +import type { OttoAPIKey } from "../../../fmdapi/src"; +import { generateTypedClients } from "../../src/typegen"; +import type { typegenConfigSingle } from "../../src/types"; + +// // Load the correct .env.local relative to this test file's directory +// dotenv.config({ path: path.resolve(__dirname, ".env.local") }); + +// Remove the old genPath definition - we'll use baseGenPath consistently + +// Helper function to recursively get all .ts files (excluding index.ts) +async function _getAllTsFilesRecursive(dir: string): Promise { + let files: string[] = []; + const entries = await fs.readdir(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + files = files.concat(await _getAllTsFilesRecursive(fullPath)); + } else if (entry.isFile() && entry.name.endsWith(".ts") && !entry.name.includes("index.ts")) { + files.push(fullPath); + } + } + return files; +} + +async function generateTypes(config: z.infer): Promise { + const genPath = path.resolve(__dirname, config.path || "./typegen-output"); // Resolve relative path to absolute + + // 1. Generate the code + await fs.mkdir(genPath, { recursive: true }); // Ensure genPath exists + await generateTypedClients(config, { cwd: import.meta.dirname }); // Pass the test directory as cwd + console.log(`Generated code in ${genPath}`); + + // // 2. Modify imports in generated files to point to local src + // const tsFiles = await getAllTsFilesRecursive(genPath); + // const targetImportString = '"@proofkit/fmdapi"'; // Target the full string including quotes + // const replacementImportString = '"../../../src"'; // Replacement string including quotes + + // console.log( + // `Checking ${tsFiles.length} generated files for import modification...`, + // ); + // for (const filePath of tsFiles) { + // const fileName = path.basename(filePath); + // console.log(` -> Modifying import in ${fileName} (${filePath})`); + // const content = await fs.readFile(filePath, "utf-8"); + // const newContent = content.replaceAll( + // targetImportString, + // replacementImportString, + // ); + + // if (content !== newContent) { + // await fs.writeFile(filePath, newContent, "utf-8"); + // } + // } + + // 3. Run tsc for type checking directly on modified files + const _relativeGenPath = path.relative( + path.resolve(__dirname, "../../.."), // Relative from monorepo root + genPath, + ); + // Ensure forward slashes for the glob pattern, even on Windows + // const globPattern = relativeGenPath.replace(/\\/g, "/") + "/**/*.ts"; + // Quote the glob pattern to handle potential spaces/special chars + // const tscCommand = `pnpm tsc --noEmit --target ESNext --module ESNext --moduleResolution bundler --strict --esModuleInterop --skipLibCheck --forceConsistentCasingInFileNames --lib ESNext,DOM --types node '${globPattern}'`; + + // Rely on tsconfig.json includes, specify path relative to monorepo root + const tscCommand = "pnpm tsc --noEmit -p packages/typegen/tsconfig.json"; + console.log(`Running type check: ${tscCommand}`); + execSync(tscCommand, { + stdio: "inherit", + cwd: path.resolve(__dirname, "../../.."), // Execute from monorepo root + }); + + return genPath; +} + +async function cleanupGeneratedFiles(genPath: string): Promise { + await fs.rm(genPath, { recursive: true, force: true }); + console.log(`Cleaned up ${genPath}`); +} + +async function testTypegenConfig(config: z.infer): Promise { + const genPath = await generateTypes(config); + await cleanupGeneratedFiles(genPath); +} + +// Helper function to get the base path for generated files +function getBaseGenPath(): string { + return path.resolve(__dirname, "./typegen-output"); +} + +// Export the functions for individual use +// +// Usage examples: +// +// 1. Generate types only: +// const config = { layouts: [...], path: "typegen-output/my-config" }; +// const genPath = await generateTypes(config); +// console.log(`Generated types in: ${genPath}`); +// +// 2. Clean up generated files: +// await cleanupGeneratedFiles(genPath); +// +// 3. Get the base path for generated files: +// const basePath = getBaseGenPath(); +// console.log(`Base path: ${basePath}`); +// + +describe("typegen", () => { + // Define a base path for generated files relative to the test file directory + const baseGenPath = getBaseGenPath(); + + // Store original env values to restore after tests + const originalEnv: Record = {}; + + // Clean up the base directory before each test + beforeEach(async () => { + await fs.rm(baseGenPath, { recursive: true, force: true }); + console.log(`Cleaned base output directory: ${baseGenPath}`); + }); + + // Restore original environment after each test + afterEach(() => { + for (const key of Object.keys(originalEnv)) { + if (originalEnv[key] === undefined) { + delete process.env[key]; + } else { + process.env[key] = originalEnv[key]; + } + } + }); + + it("basic typegen with zod", async () => { + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + valueLists: "allowEmpty", + }, + // { layoutName: "Weird Portals", schemaName: "weirdPortals" }, + ], + path: "typegen-output/config1", // Use relative path + envNames: { + auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, + server: "DIFFERENT_FM_SERVER", + db: "DIFFERENT_FM_DATABASE", + }, + clientSuffix: "Layout", + }; + await testTypegenConfig(config); + }, 30_000); + + it("basic typegen without zod", async () => { + // Define baseGenPath within the scope or ensure it's accessible + // Assuming baseGenPath is accessible from the describe block's scope + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + // add your layouts and name schemas here + { + layoutName: "layout", + schemaName: "testLayout", + valueLists: "allowEmpty", + }, + // { layoutName: "Weird Portals", schemaName: "weirdPortals" }, + + // repeat as needed for each schema... + // { layout: "my_other_layout", schemaName: "MyOtherSchema" }, + ], + path: "typegen-output/config2", // Use relative path + // webviewerScriptName: "webviewer", + envNames: { + auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, + server: "DIFFERENT_FM_SERVER", + db: "DIFFERENT_FM_DATABASE", + }, + validator: false, + }; + await testTypegenConfig(config); + }, 30_000); + + it("basic typegen with strict numbers", async () => { + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + valueLists: "allowEmpty", + strictNumbers: true, + }, + ], + path: "typegen-output/config3", // Use relative path + envNames: { + auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, + server: "DIFFERENT_FM_SERVER", + db: "DIFFERENT_FM_DATABASE", + }, + clientSuffix: "Layout", + }; + + // Step 1: Generate types + const genPath = await generateTypes(config); + + // Step 2: Use vitest file snapshots to check generated types files + // This will create/update snapshots of the generated types files + const typesPath = path.join(genPath, "generated", "testLayout.ts"); + const typesContent = await fs.readFile(typesPath, "utf-8"); + await expect(typesContent).toMatchFileSnapshot(path.join(__dirname, "../__snapshots__", "strict-numbers.snap.ts")); + + // Step 3: Clean up generated files + await cleanupGeneratedFiles(genPath); + }, 30_000); + + it("zod validator", async () => { + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + valueLists: "allowEmpty", + strictNumbers: true, + }, + { + layoutName: "customer_fieldsMissing", + schemaName: "customer", + }, + ], + path: "typegen-output/config4", // Use relative path + envNames: { + auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, + server: "DIFFERENT_FM_SERVER", + db: "DIFFERENT_FM_DATABASE", + }, + clientSuffix: "Layout", + validator: "zod", + }; + + // Step 1: Generate types + const genPath = await generateTypes(config); + + const snapshotMap = [ + { + generated: path.join(genPath, "generated", "testLayout.ts"), + snapshot: "zod-layout-client.snap.ts", + }, + { + generated: path.join(genPath, "testLayout.ts"), + snapshot: "zod-layout-overrides.snap.ts", + }, + { + generated: path.join(genPath, "customer.ts"), + snapshot: "zod-layout-client-customer.snap.ts", + }, + ]; + + for (const { generated, snapshot } of snapshotMap) { + const generatedContent = await fs.readFile(generated, "utf-8"); + await expect(generatedContent).toMatchFileSnapshot(path.join(__dirname, "../__snapshots__", snapshot)); + } + + // Step 3: Clean up generated files + await cleanupGeneratedFiles(genPath); + }, 30_000); + + it("should use OttoAdapter when apiKey is provided in envNames", async () => { + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + generateClient: true, + }, + ], + path: "typegen-output/auth-otto", + envNames: { + auth: { apiKey: "TEST_OTTO_API_KEY" as OttoAPIKey }, + server: "TEST_FM_SERVER", + db: "TEST_FM_DATABASE", + }, + generateClient: true, + }; + + const genPath = await generateTypes(config); + + // Check that the generated client uses OttoAdapter + const clientPath = path.join(genPath, "client", "testLayout.ts"); + const clientContent = await fs.readFile(clientPath, "utf-8"); + + expect(clientContent).toContain("OttoAdapter"); + expect(clientContent).not.toContain("FetchAdapter"); + expect(clientContent).toContain("TEST_OTTO_API_KEY"); + + await cleanupGeneratedFiles(genPath); + }, 30_000); + + it("should use FetchAdapter when username/password is provided in envNames", async () => { + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + generateClient: true, + }, + ], + path: "typegen-output/auth-fetch", + envNames: { + auth: { username: "TEST_USERNAME", password: "TEST_PASSWORD" }, + server: "TEST_FM_SERVER", + db: "TEST_FM_DATABASE", + }, + generateClient: true, + }; + + const genPath = await generateTypes(config); + + // Check that the generated client uses FetchAdapter + const clientPath = path.join(genPath, "client", "testLayout.ts"); + const clientContent = await fs.readFile(clientPath, "utf-8"); + + expect(clientContent).toContain("FetchAdapter"); + expect(clientContent).not.toContain("OttoAdapter"); + expect(clientContent).toContain("TEST_USERNAME"); + expect(clientContent).toContain("TEST_PASSWORD"); + + await cleanupGeneratedFiles(genPath); + }, 30_000); + + it("should use OttoAdapter with default env var names when OTTO_API_KEY is set and no envNames config provided", async () => { + // Store original env values + originalEnv.OTTO_API_KEY = process.env.OTTO_API_KEY; + originalEnv.FM_SERVER = process.env.FM_SERVER; + originalEnv.FM_DATABASE = process.env.FM_DATABASE; + originalEnv.FM_USERNAME = process.env.FM_USERNAME; + originalEnv.FM_PASSWORD = process.env.FM_PASSWORD; + + // Set up environment with default env var names (API key auth) + process.env.OTTO_API_KEY = process.env.DIFFERENT_OTTO_API_KEY || "test-api-key"; + process.env.FM_SERVER = process.env.DIFFERENT_FM_SERVER || "test-server"; + process.env.FM_DATABASE = process.env.DIFFERENT_FM_DATABASE || "test-db"; + // Ensure username/password are NOT set to force API key usage + // biome-ignore lint/performance/noDelete: delete is required to unset environment variables + delete process.env.FM_USERNAME; + // biome-ignore lint/performance/noDelete: delete is required to unset environment variables + delete process.env.FM_PASSWORD; + + // Config without envNames - should use defaults + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "layout", + schemaName: "testLayout", + generateClient: true, + }, + ], + path: "typegen-output/default-api-key", + generateClient: true, + // Note: envNames is undefined - should use defaults + envNames: undefined, + }; + + const genPath = await generateTypes(config); + + // Check that the generated client uses OttoAdapter with default env var names + const clientPath = path.join(genPath, "client", "testLayout.ts"); + const clientContent = await fs.readFile(clientPath, "utf-8"); + + // Should use OttoAdapter since OTTO_API_KEY was set + expect(clientContent).toContain("OttoAdapter"); + expect(clientContent).not.toContain("FetchAdapter"); + // Should use the default env var name + expect(clientContent).toContain("OTTO_API_KEY"); + // Should NOT have username/password env var references + expect(clientContent).not.toContain("FM_USERNAME"); + expect(clientContent).not.toContain("FM_PASSWORD"); + + await cleanupGeneratedFiles(genPath); + }, 30_000); +}); diff --git a/packages/typegen/tests/fixtures/layout-metadata.ts b/packages/typegen/tests/fixtures/layout-metadata.ts new file mode 100644 index 00000000..04fde667 --- /dev/null +++ b/packages/typegen/tests/fixtures/layout-metadata.ts @@ -0,0 +1,195 @@ +/** + * Mock Layout Metadata Fixtures + * + * These fixtures contain sample layout metadata responses for use in unit tests. + * They follow the same structure as the FileMaker Data API layoutMetadata endpoint. + * + * To add new fixtures: + * 1. Add a new entry to mockLayoutMetadata with a descriptive key + * 2. Follow the LayoutMetadataResponse structure from @proofkit/fmdapi + */ + +import type { clientTypes } from "@proofkit/fmdapi"; + +export type LayoutMetadata = clientTypes.LayoutMetadataResponse; + +/** + * Helper to create a field metadata entry + */ +function field( + name: string, + result: clientTypes.FieldMetaData["result"], + options?: Partial, +): clientTypes.FieldMetaData { + return { + name, + type: "normal", + displayType: "editText", + result, + global: false, + autoEnter: false, + fourDigitYear: false, + maxRepeat: 1, + maxCharacters: 0, + notEmpty: false, + numeric: false, + repetitions: 1, + timeOfDay: false, + ...options, + }; +} + +/** + * Helper to create a value list + */ +function valueList( + name: string, + values: string[], + type: "customList" | "byField" = "customList", +): { name: string; type: "customList" | "byField"; values: Array<{ value: string; displayValue: string }> } { + return { + name, + type, + values: values.map((v) => ({ value: v, displayValue: v })), + }; +} + +/** + * Mock layout metadata fixtures for typegen tests + */ +export const mockLayoutMetadata = { + /** + * Basic layout with text and number fields + */ + "basic-layout": { + fieldMetaData: [ + field("recordId", "text"), + field("name", "text"), + field("email", "text"), + field("age", "number"), + field("balance", "number"), + field("created_at", "timeStamp"), + ], + portalMetaData: {}, + valueLists: [], + } satisfies LayoutMetadata, + + /** + * Layout with portal data + */ + "layout-with-portal": { + fieldMetaData: [field("recordId", "text"), field("customer_name", "text"), field("total_orders", "number")], + portalMetaData: { + Orders: [ + field("Orders::order_id", "text"), + field("Orders::order_date", "date"), + field("Orders::amount", "number"), + field("Orders::status", "text"), + ], + }, + valueLists: [], + } satisfies LayoutMetadata, + + /** + * Layout with value lists + */ + "layout-with-value-lists": { + fieldMetaData: [ + field("recordId", "text"), + field("name", "text"), + field("status", "text", { valueList: "StatusOptions" }), + field("priority", "text", { valueList: "PriorityOptions" }), + field("category", "text", { valueList: "CategoryOptions" }), + ], + portalMetaData: {}, + valueLists: [ + valueList("StatusOptions", ["Active", "Inactive", "Pending"]), + valueList("PriorityOptions", ["High", "Medium", "Low"]), + valueList("CategoryOptions", ["Type A", "Type B", "Type C"]), + ], + } satisfies LayoutMetadata, + + /** + * Layout with all field types + */ + "layout-all-field-types": { + fieldMetaData: [ + field("recordId", "text"), + field("text_field", "text"), + field("number_field", "number"), + field("date_field", "date"), + field("time_field", "time"), + field("timestamp_field", "timeStamp"), + field("container_field", "container"), + field("calc_field", "text", { type: "calculation" }), + field("summary_field", "number", { type: "summary" }), + field("global_field", "text", { global: true }), + ], + portalMetaData: {}, + valueLists: [], + } satisfies LayoutMetadata, + + /** + * Complex layout with multiple portals and value lists + */ + "complex-layout": { + fieldMetaData: [ + field("customer_id", "text"), + field("first_name", "text"), + field("last_name", "text"), + field("email", "text"), + field("phone", "text"), + field("status", "text", { valueList: "CustomerStatus" }), + field("tier", "text", { valueList: "CustomerTier" }), + field("balance", "number"), + field("created_at", "timeStamp"), + field("notes", "text"), + ], + portalMetaData: { + Orders: [ + field("Orders::order_id", "text"), + field("Orders::order_date", "date"), + field("Orders::total", "number"), + field("Orders::status", "text"), + ], + Invoices: [ + field("Invoices::invoice_id", "text"), + field("Invoices::invoice_date", "date"), + field("Invoices::amount", "number"), + field("Invoices::paid", "number"), + ], + }, + valueLists: [ + valueList("CustomerStatus", ["Active", "Inactive", "Suspended"]), + valueList("CustomerTier", ["Bronze", "Silver", "Gold", "Platinum"]), + ], + } satisfies LayoutMetadata, + + /** + * Layout simulating "layout" from the E2E test environment + * (matches the layout used in typegen.test.ts) + */ + layout: { + fieldMetaData: [ + field("recordId", "text"), + field("anything", "text"), + field("booleanField", "number"), + field("CreationTimestamp", "timeStamp"), + ], + portalMetaData: { + test: [field("related::related_field", "text"), field("related::recordId", "number")], + }, + valueLists: [valueList("TestValueList", ["Option 1", "Option 2", "Option 3"])], + } satisfies LayoutMetadata, + + /** + * Layout simulating "customer_fieldsMissing" from the E2E test environment + */ + customer_fieldsMissing: { + fieldMetaData: [field("name", "text"), field("phone", "text")], + portalMetaData: {}, + valueLists: [], + } satisfies LayoutMetadata, +} satisfies Record; + +export type MockLayoutMetadataKey = keyof typeof mockLayoutMetadata; diff --git a/packages/typegen/tests/setupEnv.ts b/packages/typegen/tests/setupEnv.ts index eee4e1e8..48cece51 100644 --- a/packages/typegen/tests/setupEnv.ts +++ b/packages/typegen/tests/setupEnv.ts @@ -1,10 +1,4 @@ -import path from "node:path"; -import dotenv from "dotenv"; - -// Load .env.local from the parent directory (packages/typegen) relative to this setup file (packages/typegen/tests) -dotenv.config({ path: path.resolve(__dirname, "../.env.local") }); - -console.log("SetupEnv: Loading .env.local from", path.resolve(__dirname, "../.env.local")); +// Environment variables are injected by doppler run console.log("SetupEnv: DIFFERENT_FM_SERVER=", process.env.DIFFERENT_FM_SERVER ? "Loaded" : "Not Loaded"); console.log("SetupEnv: DIFFERENT_FM_DATABASE=", process.env.DIFFERENT_FM_DATABASE ? "Loaded" : "Not Loaded"); console.log("SetupEnv: DIFFERENT_OTTO_API_KEY=", process.env.DIFFERENT_OTTO_API_KEY ? "Loaded" : "Not Loaded"); diff --git a/packages/typegen/tests/typegen.test.ts b/packages/typegen/tests/typegen.test.ts index 064bdc99..3d570fd1 100644 --- a/packages/typegen/tests/typegen.test.ts +++ b/packages/typegen/tests/typegen.test.ts @@ -1,323 +1,468 @@ -import { execSync } from "node:child_process"; +/** + * Unit Tests for Typegen (fmdapi) + * + * These tests use mocked layout metadata responses to test the code generation + * logic without requiring a live FileMaker server connection. + */ + import fs from "node:fs/promises"; import path from "node:path"; -import { beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import type { z } from "zod/v4"; -import type { OttoAPIKey } from "../../fmdapi/src"; import { generateTypedClients } from "../src/typegen"; import type { typegenConfigSingle } from "../src/types"; +import { mockLayoutMetadata } from "./fixtures/layout-metadata"; +import { createLayoutMetadataMock, createLayoutMetadataSequenceMock } from "./utils/mock-fetch"; -// // Load the correct .env.local relative to this test file's directory -// dotenv.config({ path: path.resolve(__dirname, ".env.local") }); - -// Remove the old genPath definition - we'll use baseGenPath consistently - -// Helper function to recursively get all .ts files (excluding index.ts) -async function _getAllTsFilesRecursive(dir: string): Promise { - let files: string[] = []; - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - if (entry.isDirectory()) { - files = files.concat(await _getAllTsFilesRecursive(fullPath)); - } else if (entry.isFile() && entry.name.endsWith(".ts") && !entry.name.includes("index.ts")) { - files.push(fullPath); - } - } - return files; -} - -async function generateTypes(config: z.infer): Promise { - const genPath = path.resolve(__dirname, config.path || "./typegen-output"); // Resolve relative path to absolute - - // 1. Generate the code - await fs.mkdir(genPath, { recursive: true }); // Ensure genPath exists - await generateTypedClients(config, { cwd: import.meta.dirname }); // Pass the test directory as cwd - console.log(`Generated code in ${genPath}`); - - // // 2. Modify imports in generated files to point to local src - // const tsFiles = await getAllTsFilesRecursive(genPath); - // const targetImportString = '"@proofkit/fmdapi"'; // Target the full string including quotes - // const replacementImportString = '"../../../src"'; // Replacement string including quotes - - // console.log( - // `Checking ${tsFiles.length} generated files for import modification...`, - // ); - // for (const filePath of tsFiles) { - // const fileName = path.basename(filePath); - // console.log(` -> Modifying import in ${fileName} (${filePath})`); - // const content = await fs.readFile(filePath, "utf-8"); - // const newContent = content.replaceAll( - // targetImportString, - // replacementImportString, - // ); - - // if (content !== newContent) { - // await fs.writeFile(filePath, newContent, "utf-8"); - // } - // } - - // 3. Run tsc for type checking directly on modified files - const _relativeGenPath = path.relative( - path.resolve(__dirname, "../../.."), // Relative from monorepo root - genPath, - ); - // Ensure forward slashes for the glob pattern, even on Windows - // const globPattern = relativeGenPath.replace(/\\/g, "/") + "/**/*.ts"; - // Quote the glob pattern to handle potential spaces/special chars - // const tscCommand = `pnpm tsc --noEmit --target ESNext --module ESNext --moduleResolution bundler --strict --esModuleInterop --skipLibCheck --forceConsistentCasingInFileNames --lib ESNext,DOM --types node '${globPattern}'`; - - // Rely on tsconfig.json includes, specify path relative to monorepo root - const tscCommand = "pnpm tsc --noEmit -p packages/typegen/tsconfig.json"; - console.log(`Running type check: ${tscCommand}`); - execSync(tscCommand, { - stdio: "inherit", - cwd: path.resolve(__dirname, "../../.."), // Execute from monorepo root - }); - - return genPath; +// Helper function to get the base path for generated files +function getBaseGenPath(): string { + return path.resolve(__dirname, "./unit-typegen-output"); } async function cleanupGeneratedFiles(genPath: string): Promise { await fs.rm(genPath, { recursive: true, force: true }); - console.log(`Cleaned up ${genPath}`); } -async function testTypegenConfig(config: z.infer): Promise { - const genPath = await generateTypes(config); - await cleanupGeneratedFiles(genPath); -} - -// Helper function to get the base path for generated files -function getBaseGenPath(): string { - return path.resolve(__dirname, "./typegen-output"); -} - -// Export the functions for individual use -// -// Usage examples: -// -// 1. Generate types only: -// const config = { layouts: [...], path: "typegen-output/my-config" }; -// const genPath = await generateTypes(config); -// console.log(`Generated types in: ${genPath}`); -// -// 2. Clean up generated files: -// await cleanupGeneratedFiles(genPath); -// -// 3. Get the base path for generated files: -// const basePath = getBaseGenPath(); -// console.log(`Base path: ${basePath}`); -// - -describe("typegen", () => { - // Define a base path for generated files relative to the test file directory +describe("typegen unit tests", () => { const baseGenPath = getBaseGenPath(); - // Clean up the base directory before each test + // Store original env values to restore after tests + const originalEnv: Record = {}; + beforeEach(async () => { + // Clean up any previous output await fs.rm(baseGenPath, { recursive: true, force: true }); - console.log(`Cleaned base output directory: ${baseGenPath}`); + + // Save original env + originalEnv.OTTO_API_KEY = process.env.OTTO_API_KEY; + originalEnv.FM_SERVER = process.env.FM_SERVER; + originalEnv.FM_DATABASE = process.env.FM_DATABASE; + originalEnv.FM_USERNAME = process.env.FM_USERNAME; + originalEnv.FM_PASSWORD = process.env.FM_PASSWORD; + + // Set mock env values for tests + // Use valid Otto API key format (KEY_ prefix for Otto v3) + process.env.OTTO_API_KEY = "KEY_test_api_key_12345"; + process.env.FM_SERVER = "https://test.example.com"; + process.env.FM_DATABASE = "TestDB"; }); - it("basic typegen with zod", async () => { + afterEach(async () => { + // Restore original env + for (const key of Object.keys(originalEnv)) { + if (originalEnv[key] === undefined) { + delete process.env[key]; + } else { + process.env[key] = originalEnv[key]; + } + } + + // Clean up generated files + await cleanupGeneratedFiles(baseGenPath); + + // Restore fetch + vi.unstubAllGlobals(); + }); + + it("generates schema file with basic fields", async () => { + // Mock fetch to return basic layout metadata + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + TestLayout: mockLayoutMetadata["basic-layout"], + }), + ); + const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ { - layoutName: "layout", - schemaName: "testLayout", - valueLists: "allowEmpty", + layoutName: "TestLayout", + schemaName: "testSchema", }, - // { layoutName: "Weird Portals", schemaName: "weirdPortals" }, ], - path: "typegen-output/config1", // Use relative path - envNames: { - auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, - server: "DIFFERENT_FM_SERVER", - db: "DIFFERENT_FM_DATABASE", - }, - clientSuffix: "Layout", + path: "unit-typegen-output/basic", + generateClient: false, + validator: false, }; - await testTypegenConfig(config); - }, 30_000); - it("basic typegen without zod", async () => { - // Define baseGenPath within the scope or ensure it's accessible - // Assuming baseGenPath is accessible from the describe block's scope + await generateTypedClients(config, { cwd: import.meta.dirname }); + + // Verify the generated file exists + const schemaPath = path.join(__dirname, "unit-typegen-output/basic/generated/testSchema.ts"); + const exists = await fs + .access(schemaPath) + .then(() => true) + .catch(() => false); + expect(exists).toBe(true); + + // Check content has expected fields + const content = await fs.readFile(schemaPath, "utf-8"); + expect(content).toContain("recordId"); + expect(content).toContain("name"); + expect(content).toContain("email"); + expect(content).toContain("age"); + expect(content).toContain("balance"); + expect(content).toContain("created_at"); + }); + + it("generates schema with portal data", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + CustomerLayout: mockLayoutMetadata["layout-with-portal"], + }), + ); + const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ - // add your layouts and name schemas here { - layoutName: "layout", - schemaName: "testLayout", - valueLists: "allowEmpty", + layoutName: "CustomerLayout", + schemaName: "customer", }, - // { layoutName: "Weird Portals", schemaName: "weirdPortals" }, - - // repeat as needed for each schema... - // { layout: "my_other_layout", schemaName: "MyOtherSchema" }, ], - path: "typegen-output/config2", // Use relative path - // webviewerScriptName: "webviewer", - envNames: { - auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, - server: "DIFFERENT_FM_SERVER", - db: "DIFFERENT_FM_DATABASE", - }, + path: "unit-typegen-output/portal", + generateClient: false, validator: false, }; - await testTypegenConfig(config); - }, 30_000); - it("basic typegen with strict numbers", async () => { + await generateTypedClients(config, { cwd: import.meta.dirname }); + + const schemaPath = path.join(__dirname, "unit-typegen-output/portal/generated/customer.ts"); + const content = await fs.readFile(schemaPath, "utf-8"); + + // Check portal-related content + expect(content).toContain("Orders"); + expect(content).toContain("order_id"); + expect(content).toContain("order_date"); + expect(content).toContain("amount"); + }); + + it("generates schema with value lists", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + StatusLayout: mockLayoutMetadata["layout-with-value-lists"], + }), + ); + const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ { - layoutName: "layout", - schemaName: "testLayout", - valueLists: "allowEmpty", - strictNumbers: true, + layoutName: "StatusLayout", + schemaName: "statusSchema", + valueLists: "strict", }, ], - path: "typegen-output/config3", // Use relative path - envNames: { - auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, - server: "DIFFERENT_FM_SERVER", - db: "DIFFERENT_FM_DATABASE", - }, - clientSuffix: "Layout", + path: "unit-typegen-output/valuelists", + generateClient: false, + validator: "zod", }; - // Step 1: Generate types - const genPath = await generateTypes(config); + await generateTypedClients(config, { cwd: import.meta.dirname }); - // Step 2: Use vitest file snapshots to check generated types files - // This will create/update snapshots of the generated types files - const typesPath = path.join(genPath, "generated", "testLayout.ts"); - const typesContent = await fs.readFile(typesPath, "utf-8"); - await expect(typesContent).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", "strict-numbers.snap.ts")); + const schemaPath = path.join(__dirname, "unit-typegen-output/valuelists/generated/statusSchema.ts"); + const content = await fs.readFile(schemaPath, "utf-8"); + + // Check value list literals are generated + expect(content).toContain("Active"); + expect(content).toContain("Inactive"); + expect(content).toContain("Pending"); + expect(content).toContain("High"); + expect(content).toContain("Medium"); + expect(content).toContain("Low"); + }); - // Step 3: Clean up generated files - await cleanupGeneratedFiles(genPath); - }, 30_000); + it("generates schema with all field types", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + AllFields: mockLayoutMetadata["layout-all-field-types"], + }), + ); - it("zod validator", async () => { const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ { - layoutName: "layout", - schemaName: "testLayout", - valueLists: "allowEmpty", - strictNumbers: true, + layoutName: "AllFields", + schemaName: "allFields", }, + ], + path: "unit-typegen-output/allfields", + generateClient: false, + validator: false, + }; + + await generateTypedClients(config, { cwd: import.meta.dirname }); + + const schemaPath = path.join(__dirname, "unit-typegen-output/allfields/generated/allFields.ts"); + const content = await fs.readFile(schemaPath, "utf-8"); + + // Check various field types are present + expect(content).toContain("text_field"); + expect(content).toContain("number_field"); + expect(content).toContain("date_field"); + expect(content).toContain("time_field"); + expect(content).toContain("timestamp_field"); + expect(content).toContain("container_field"); + expect(content).toContain("calc_field"); + expect(content).toContain("summary_field"); + expect(content).toContain("global_field"); + }); + + it("generates zod validators when specified", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + ZodLayout: mockLayoutMetadata["basic-layout"], + }), + ); + + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ { - layoutName: "customer_fieldsMissing", - schemaName: "customer", + layoutName: "ZodLayout", + schemaName: "zodSchema", }, ], - path: "typegen-output/config4", // Use relative path - envNames: { - auth: { apiKey: "DIFFERENT_OTTO_API_KEY" as OttoAPIKey }, - server: "DIFFERENT_FM_SERVER", - db: "DIFFERENT_FM_DATABASE", - }, - clientSuffix: "Layout", + path: "unit-typegen-output/zod", + generateClient: false, validator: "zod", }; - // Step 1: Generate types - const genPath = await generateTypes(config); + await generateTypedClients(config, { cwd: import.meta.dirname }); - const snapshotMap = [ - { - generated: path.join(genPath, "generated", "testLayout.ts"), - snapshot: "zod-layout-client.snap.ts", - }, - { - generated: path.join(genPath, "testLayout.ts"), - snapshot: "zod-layout-overrides.snap.ts", - }, - { - generated: path.join(genPath, "customer.ts"), - snapshot: "zod-layout-client-customer.snap.ts", - }, - ]; + const schemaPath = path.join(__dirname, "unit-typegen-output/zod/generated/zodSchema.ts"); + const content = await fs.readFile(schemaPath, "utf-8"); - for (const { generated, snapshot } of snapshotMap) { - const generatedContent = await fs.readFile(generated, "utf-8"); - await expect(generatedContent).toMatchFileSnapshot(path.join(__dirname, "__snapshots__", snapshot)); - } + // Check for zod imports and schema definitions + expect(content).toContain('from "zod'); + expect(content).toContain("z.object"); + }); - // Step 3: Clean up generated files - await cleanupGeneratedFiles(genPath); - }, 30_000); + it("generates client file when generateClient is true", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + ClientLayout: mockLayoutMetadata["basic-layout"], + }), + ); - it("should use OttoAdapter when apiKey is provided in envNames", async () => { const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ { - layoutName: "layout", - schemaName: "testLayout", - generateClient: true, + layoutName: "ClientLayout", + schemaName: "clientSchema", }, ], - path: "typegen-output/auth-otto", - envNames: { - auth: { apiKey: "TEST_OTTO_API_KEY" as OttoAPIKey }, - server: "TEST_FM_SERVER", - db: "TEST_FM_DATABASE", - }, + path: "unit-typegen-output/client", generateClient: true, + validator: false, + }; + + await generateTypedClients(config, { cwd: import.meta.dirname }); + + // Check client file exists + const clientPath = path.join(__dirname, "unit-typegen-output/client/client/clientSchema.ts"); + const exists = await fs + .access(clientPath) + .then(() => true) + .catch(() => false); + expect(exists).toBe(true); + + const content = await fs.readFile(clientPath, "utf-8"); + expect(content).toContain("DataApi"); + expect(content).toContain("OttoAdapter"); + }); + + it("generates override file that can be edited", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + OverrideLayout: mockLayoutMetadata["basic-layout"], + }), + ); + + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "OverrideLayout", + schemaName: "overrideSchema", + }, + ], + path: "unit-typegen-output/override", + generateClient: false, + validator: "zod", }; - const genPath = await generateTypes(config); + await generateTypedClients(config, { cwd: import.meta.dirname }); - // Check that the generated client uses OttoAdapter - const clientPath = path.join(genPath, "client", "testLayout.ts"); - const clientContent = await fs.readFile(clientPath, "utf-8"); + // Check override file exists + const overridePath = path.join(__dirname, "unit-typegen-output/override/overrideSchema.ts"); + const exists = await fs + .access(overridePath) + .then(() => true) + .catch(() => false); + expect(exists).toBe(true); + + const content = await fs.readFile(overridePath, "utf-8"); + // Override file should re-export from generated + expect(content).toContain("generated/overrideSchema"); + }); + + it("handles multiple layouts in sequence", async () => { + // Use sequence mock for multiple layouts + vi.stubGlobal( + "fetch", + createLayoutMetadataSequenceMock([mockLayoutMetadata["basic-layout"], mockLayoutMetadata["layout-with-portal"]]), + ); + + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "Layout1", + schemaName: "schema1", + }, + { + layoutName: "Layout2", + schemaName: "schema2", + }, + ], + path: "unit-typegen-output/multi", + generateClient: false, + validator: false, + }; + + await generateTypedClients(config, { cwd: import.meta.dirname }); + + // Check both schema files exist + const schema1Path = path.join(__dirname, "unit-typegen-output/multi/generated/schema1.ts"); + const schema2Path = path.join(__dirname, "unit-typegen-output/multi/generated/schema2.ts"); + + const [exists1, exists2] = await Promise.all([ + fs + .access(schema1Path) + .then(() => true) + .catch(() => false), + fs + .access(schema2Path) + .then(() => true) + .catch(() => false), + ]); + + expect(exists1).toBe(true); + expect(exists2).toBe(true); + }); - expect(clientContent).toContain("OttoAdapter"); - expect(clientContent).not.toContain("FetchAdapter"); - expect(clientContent).toContain("TEST_OTTO_API_KEY"); + it("uses FetchAdapter when username/password env vars are set", async () => { + // Set username/password instead of API key + // biome-ignore lint/performance/noDelete: required to unset env vars + delete process.env.OTTO_API_KEY; + process.env.FM_USERNAME = "testuser"; + process.env.FM_PASSWORD = "testpass"; - await cleanupGeneratedFiles(genPath); - }, 30_000); + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + FetchLayout: mockLayoutMetadata["basic-layout"], + }), + ); - it("should use FetchAdapter when username/password is provided in envNames", async () => { const config: Extract, { type: "fmdapi" }> = { type: "fmdapi", layouts: [ { - layoutName: "layout", - schemaName: "testLayout", - generateClient: true, + layoutName: "FetchLayout", + schemaName: "fetchSchema", }, ], - path: "typegen-output/auth-fetch", + path: "unit-typegen-output/fetch", + generateClient: true, envNames: { - auth: { username: "TEST_USERNAME", password: "TEST_PASSWORD" }, - server: "TEST_FM_SERVER", - db: "TEST_FM_DATABASE", + auth: { username: "FM_USERNAME", password: "FM_PASSWORD" }, + server: "FM_SERVER", + db: "FM_DATABASE", }, - generateClient: true, }; - const genPath = await generateTypes(config); + await generateTypedClients(config, { cwd: import.meta.dirname }); + + const clientPath = path.join(__dirname, "unit-typegen-output/fetch/client/fetchSchema.ts"); + const content = await fs.readFile(clientPath, "utf-8"); + + expect(content).toContain("FetchAdapter"); + expect(content).not.toContain("OttoAdapter"); + expect(content).toContain("FM_USERNAME"); + expect(content).toContain("FM_PASSWORD"); + }); + + it("handles strictNumbers option", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + StrictLayout: mockLayoutMetadata["basic-layout"], + }), + ); + + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "StrictLayout", + schemaName: "strictSchema", + strictNumbers: true, + }, + ], + path: "unit-typegen-output/strict", + generateClient: false, + validator: "zod", + }; + + await generateTypedClients(config, { cwd: import.meta.dirname }); + + const schemaPath = path.join(__dirname, "unit-typegen-output/strict/generated/strictSchema.ts"); + const content = await fs.readFile(schemaPath, "utf-8"); + + // With strict numbers, number fields should have stricter validation + // Check file was generated (content validation depends on implementation) + expect(content).toBeDefined(); + expect(content.length).toBeGreaterThan(0); + }); + + it("handles custom client suffix", async () => { + vi.stubGlobal( + "fetch", + createLayoutMetadataMock({ + SuffixLayout: mockLayoutMetadata["basic-layout"], + }), + ); + + const config: Extract, { type: "fmdapi" }> = { + type: "fmdapi", + layouts: [ + { + layoutName: "SuffixLayout", + schemaName: "suffixSchema", + }, + ], + path: "unit-typegen-output/suffix", + generateClient: true, + clientSuffix: "Layout", + }; - // Check that the generated client uses FetchAdapter - const clientPath = path.join(genPath, "client", "testLayout.ts"); - const clientContent = await fs.readFile(clientPath, "utf-8"); + await generateTypedClients(config, { cwd: import.meta.dirname }); - expect(clientContent).toContain("FetchAdapter"); - expect(clientContent).not.toContain("OttoAdapter"); - expect(clientContent).toContain("TEST_USERNAME"); - expect(clientContent).toContain("TEST_PASSWORD"); + // Check index file has the custom suffix + const indexPath = path.join(__dirname, "unit-typegen-output/suffix/client/index.ts"); + const content = await fs.readFile(indexPath, "utf-8"); - await cleanupGeneratedFiles(genPath); - }, 30_000); + expect(content).toContain("suffixSchemaLayout"); + }); }); diff --git a/packages/typegen/tests/utils/mock-fetch.ts b/packages/typegen/tests/utils/mock-fetch.ts new file mode 100644 index 00000000..3711ef50 --- /dev/null +++ b/packages/typegen/tests/utils/mock-fetch.ts @@ -0,0 +1,179 @@ +/** + * Mock Fetch Utility for Typegen Tests + * + * This utility creates mock fetch functions for testing typegen without + * connecting to a real FileMaker server. It intercepts requests to the + * FileMaker Data API and returns pre-configured responses. + * + * Usage: + * ```ts + * import { vi } from 'vitest'; + * import { createLayoutMetadataMock } from '../utils/mock-fetch'; + * import { mockLayoutMetadata } from '../fixtures/layout-metadata'; + * + * // Mock a single layout's metadata + * vi.stubGlobal('fetch', createLayoutMetadataMock({ + * layout: mockLayoutMetadata['basic-layout'], + * })); + * + * // Mock multiple layouts + * vi.stubGlobal('fetch', createLayoutMetadataMock({ + * layout: mockLayoutMetadata['layout'], + * customer_fieldsMissing: mockLayoutMetadata['customer_fieldsMissing'], + * })); + * ``` + */ + +import type { LayoutMetadata, MockLayoutMetadataKey } from "../fixtures/layout-metadata"; + +// Move regex to top level for performance +const LAYOUT_URL_PATTERN = /\/layouts\/([^/?]+)(?:\?|$)/; +const SESSIONS_URL_PATTERN = /\/sessions$/; + +/** + * Extract URL string from various input types + */ +function getUrlString(input: RequestInfo | URL): string { + if (typeof input === "string") { + return input; + } + if (input instanceof URL) { + return input.toString(); + } + return input.url; +} + +/** + * Creates a mock fetch function that returns layout metadata responses + * based on the layout name in the request URL. + * + * @param layouts - Map of layout names to their metadata responses + * @returns A fetch-compatible function + */ +export function createLayoutMetadataMock(layouts: Record): typeof fetch { + return (input: RequestInfo | URL, _init?: RequestInit): Promise => { + const url = getUrlString(input); + + // Handle FetchAdapter session/token requests + // FetchAdapter expects token in X-FM-Data-Access-Token header + if (SESSIONS_URL_PATTERN.test(url)) { + const tokenResponse = { + messages: [{ code: "0", message: "OK" }], + response: {}, + }; + + return Promise.resolve( + new Response(JSON.stringify(tokenResponse), { + status: 200, + statusText: "OK", + headers: { + "content-type": "application/json", + "X-FM-Data-Access-Token": "mock-session-token-12345", + }, + }), + ); + } + + // Extract layout name from URL pattern: /layouts/{layoutName} + const layoutMatch = url.match(LAYOUT_URL_PATTERN); + const layoutName = layoutMatch?.[1] ? decodeURIComponent(layoutMatch[1]) : null; + + // Check if this is a layout metadata request (no /records, /_find, etc.) + const isLayoutMetadataRequest = layoutMatch && !url.includes("/records") && !url.includes("/_find"); + + if (isLayoutMetadataRequest && layoutName && layouts[layoutName]) { + const response = { + messages: [{ code: "0", message: "OK" }], + response: layouts[layoutName], + }; + + return Promise.resolve( + new Response(JSON.stringify(response), { + status: 200, + statusText: "OK", + headers: { "content-type": "application/json" }, + }), + ); + } + + // For layout not found + if (isLayoutMetadataRequest && layoutName && !layouts[layoutName]) { + const response = { + messages: [{ code: "105", message: "Layout is missing" }], + response: {}, + }; + + return Promise.resolve( + new Response(JSON.stringify(response), { + status: 500, + statusText: "Error", + headers: { "content-type": "application/json" }, + }), + ); + } + + // Default: return 404 for unknown requests + return Promise.resolve( + new Response(JSON.stringify({ error: "Not found" }), { + status: 404, + statusText: "Not Found", + headers: { "content-type": "application/json" }, + }), + ); + }; +} + +/** + * Creates a mock fetch function using predefined fixture keys + * + * @param layoutMap - Map of layout names to fixture keys + * @param fixtures - The mockLayoutMetadata object + * @returns A fetch-compatible function + */ +export function createLayoutMetadataMockFromFixtures( + layoutMap: Record, + fixtures: Record, +): typeof fetch { + const layouts: Record = {}; + for (const [layoutName, fixtureKey] of Object.entries(layoutMap)) { + const fixture = fixtures[fixtureKey]; + if (fixture) { + layouts[layoutName] = fixture; + } + } + return createLayoutMetadataMock(layouts); +} + +/** + * Creates a mock fetch that returns a sequence of responses + * Useful for tests that call layoutMetadata multiple times + * + * @param responses - Array of layout metadata responses in order + * @returns A fetch-compatible function + */ +export function createLayoutMetadataSequenceMock(responses: LayoutMetadata[]): typeof fetch { + let callIndex = 0; + + return (_input: RequestInfo | URL, _init?: RequestInit): Promise => { + const metadata = responses[callIndex]; + if (!metadata) { + throw new Error( + `Mock fetch called more times than expected. Call #${callIndex + 1}, but only ${responses.length} responses provided.`, + ); + } + callIndex++; + + const response = { + messages: [{ code: "0", message: "OK" }], + response: metadata, + }; + + return Promise.resolve( + new Response(JSON.stringify(response), { + status: 200, + statusText: "OK", + headers: { "content-type": "application/json" }, + }), + ); + }; +} diff --git a/packages/typegen/vitest.config.ts b/packages/typegen/vitest.config.ts index 0a0c572b..594afc5d 100644 --- a/packages/typegen/vitest.config.ts +++ b/packages/typegen/vitest.config.ts @@ -9,5 +9,8 @@ export default defineConfig({ test: { testTimeout: 15_000, // 15 seconds, since we're making a network call to FM setupFiles: ["./tests/setupEnv.ts"], // Add setup file + // Exclude E2E tests from default test runs + // Run E2E tests with: pnpm test:e2e + exclude: ["**/node_modules/**", "**/dist/**", "tests/e2e/**"], }, }); diff --git a/packages/typegen/web/package.json b/packages/typegen/web/package.json index be604740..cca5fb1c 100644 --- a/packages/typegen/web/package.json +++ b/packages/typegen/web/package.json @@ -14,42 +14,42 @@ "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@fetchkit/ffetch": "^4.2.0", - "@headless-tree/core": "^1.6.0", - "@headless-tree/react": "^1.6.0", + "@headless-tree/core": "^1.6.2", + "@headless-tree/react": "^1.6.2", "@hookform/resolvers": "^5.2.2", "@proofkit/typegen": "workspace:*", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-direction": "^1.1.1", - "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-tooltip": "^1.2.8", - "@remixicon/react": "^4.7.0", + "@remixicon/react": "^4.8.0", "@tailwindcss/vite": "^4.1.18", - "@tanstack/react-query": "^5.90.12", + "@tanstack/react-query": "^5.90.16", "@tanstack/react-table": "^8.21.3", - "@tanstack/react-virtual": "^3.13.13", + "@tanstack/react-virtual": "^3.13.18", "@uidotdev/usehooks": "^2.4.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", - "hono": "^4.9.0", + "hono": "^4.11.3", "lucide-react": "^0.511.0", "radix-ui": "^1.4.3", "react": "19.2.3", "react-dom": "19.2.3", - "react-hook-form": "^7.68.0", + "react-hook-form": "^7.71.0", "sonner": "^2.0.7", - "tailwind-merge": "^3.3.1", - "tailwindcss": "^4.1.11", - "zod": "^4.2.0" + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.18", + "zod": "^4.3.5" }, "devDependencies": { - "@tanstack/react-query-devtools": "^5.91.1", - "@types/node": "^22.17.1", + "@tanstack/react-query-devtools": "^5.91.2", + "@types/node": "^22.19.5", "@types/react": "19.2.7", "@types/react-dom": "19.2.3", - "@vitejs/plugin-react": "^4.3.4", - "tw-animate-css": "^1.3.6", + "@vitejs/plugin-react": "^4.7.0", + "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "^6.3.4" + "vite": "^6.4.1" } } diff --git a/packages/webviewer/package.json b/packages/webviewer/package.json index 80931c45..2d31ee4b 100644 --- a/packages/webviewer/package.json +++ b/packages/webviewer/package.json @@ -36,19 +36,20 @@ "devDependencies": { "@arethetypeswrong/cli": "^0.17.4", "@proofkit/fmdapi": "workspace:*", - "@tanstack/vite-config": "^0.2.0", - "@types/filemaker-webviewer": "^1.0.0", - "@types/node": "^22.17.1", + "@tanstack/vite-config": "^0.2.1", + "@types/filemaker-webviewer": "^1.0.3", + "@types/node": "^22.19.5", "@types/uuid": "^10.0.0", - "knip": "^5.56.0", + "knip": "^5.80.2", "publint": "^0.3.16", "typescript": "^5.9.3", - "vite": "^6.3.4" + "vite": "^6.4.1" }, "publishConfig": { "access": "public" }, "scripts": { + "typecheck": "tsc --noEmit", "prepublishOnly": "tsc", "build": "tsc && vite build && publint --strict", "build:watch": "tsc && vite build --watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8deca935..a185ef77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,12 @@ settings: overrides: shiki: 3.13.0 '@shikijs/types': 3.13.0 + glob: ^11.1.0 + '@modelcontextprotocol/sdk': ^1.25.2 + preact: ^10.26.10 + qs: ^6.14.1 + vite: ^6.4.1 + body-parser: ^2.2.1 importers: @@ -16,23 +22,23 @@ importers: specifier: 2.3.11 version: 2.3.11 '@changesets/cli': - specifier: ^2.29.3 - version: 2.29.4 + specifier: ^2.29.8 + version: 2.29.8(@types/node@22.19.5) '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 husky: specifier: ^9.1.7 version: 9.1.7 knip: - specifier: ^5.56.0 - version: 5.56.0(@types/node@22.17.1)(typescript@5.9.3) + specifier: ^5.80.2 + version: 5.80.2(@types/node@22.19.5)(typescript@5.9.3) lint-staged: specifier: ^16.2.7 version: 16.2.7 turbo: - specifier: ^2.5.4 - version: 2.5.4 + specifier: ^2.7.4 + version: 2.7.4 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -40,8 +46,8 @@ importers: specifier: 7.0.8 version: 7.0.8(typescript@5.9.3) vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) apps/docs: dependencies: @@ -70,14 +76,14 @@ importers: specifier: ^1.2.10 version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-separator': - specifier: ^1.1.7 - version: 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.1.8 + version: 1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-slot': - specifier: ^1.2.3 - version: 1.2.3(@types/react@19.2.7)(react@19.2.3) + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.7)(react@19.2.3) '@tabler/icons-react': - specifier: ^3.34.1 - version: 3.34.1(react@19.2.3) + specifier: ^3.36.1 + version: 3.36.1(react@19.2.3) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -86,22 +92,22 @@ importers: version: 2.1.1 fumadocs-core: specifier: 16.4.4 - version: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) + version: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) fumadocs-mdx: specifier: 14.2.4 - version: 14.2.4(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.4(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-twoslash: specifier: ^3.1.12 - version: 3.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) + version: 3.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) fumadocs-typescript: specifier: ^5.0.1 - version: 5.0.1(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3) + version: 5.0.1(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3) fumadocs-ui: specifier: 16.4.4 - version: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5) + version: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5) hono: - specifier: ^4.9.0 - version: 4.9.0 + specifier: ^4.11.3 + version: 4.11.3 jiti: specifier: ^1.21.7 version: 1.21.7 @@ -110,7 +116,7 @@ importers: version: 0.511.0(react@19.2.3) next: specifier: 16.1.1 - version: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -122,29 +128,29 @@ importers: version: 19.2.3(react@19.2.3) shadcn: specifier: ^2.10.0 - version: 2.10.0(@types/node@22.17.1)(typescript@5.9.3) + version: 2.10.0(@types/node@22.19.5)(hono@4.11.3)(typescript@5.9.3) shiki: specifier: 3.13.0 version: 3.13.0 tailwind-merge: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.4.0 + version: 3.4.0 ts-morph: specifier: ^26.0.0 version: 26.0.0 twoslash: - specifier: ^0.3.4 - version: 0.3.4(typescript@5.9.3) + specifier: ^0.3.6 + version: 0.3.6(typescript@5.9.3) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 devDependencies: '@proofkit/fmdapi': specifier: workspace:* version: link:../../packages/fmdapi '@tailwindcss/postcss': - specifier: ^4.1.11 - version: 4.1.11 + specifier: ^4.1.18 + version: 4.1.18 '@types/jest': specifier: ^29.5.14 version: 29.5.14 @@ -152,8 +158,8 @@ importers: specifier: ^2.0.13 version: 2.0.13 '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -161,70 +167,70 @@ importers: specifier: 19.2.3 version: 19.2.3(@types/react@19.2.7) happy-dom: - specifier: ^15.11.7 - version: 15.11.7 + specifier: ^20.1.0 + version: 20.1.0 postcss: specifier: ^8.5.6 version: 8.5.6 tailwindcss: - specifier: ^4.1.11 - version: 4.1.11 + specifier: ^4.1.18 + version: 4.1.18 tw-animate-css: - specifier: ^1.3.6 - version: 1.3.6 + specifier: ^1.4.0 + version: 1.4.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages/better-auth: dependencies: '@babel/preset-react': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.5) + specifier: ^7.28.5 + version: 7.28.5(@babel/core@7.28.5) '@babel/preset-typescript': - specifier: ^7.27.1 - version: 7.27.1(@babel/core@7.28.5) + specifier: ^7.28.5 + version: 7.28.5(@babel/core@7.28.5) '@commander-js/extra-typings': specifier: ^14.0.0 - version: 14.0.0(commander@14.0.0) + version: 14.0.0(commander@14.0.2) '@tanstack/vite-config': - specifier: ^0.2.0 - version: 0.2.0(@types/node@22.19.3)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.2.1 + version: 0.2.1(@types/node@25.0.6)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) better-auth: - specifier: ^1.2.10 - version: 1.2.10 + specifier: ^1.4.11 + version: 1.4.11(@prisma/client@5.22.0(prisma@5.22.0))(mysql2@3.16.0)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(prisma@5.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.0.17) c12: - specifier: ^3.0.4 - version: 3.0.4(magicast@0.3.5) + specifier: ^3.3.3 + version: 3.3.3(magicast@0.3.5) chalk: specifier: 5.4.1 version: 5.4.1 commander: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.0.2 + version: 14.0.2 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 fs-extra: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^11.3.3 + version: 11.3.3 neverthrow: specifier: ^8.2.0 version: 8.2.0 odata-query: - specifier: ^8.0.4 - version: 8.0.4 + specifier: ^8.0.7 + version: 8.0.7 prompts: specifier: ^2.4.2 version: 2.4.2 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 devDependencies: '@types/fs-extra': @@ -235,10 +241,10 @@ importers: version: 2.4.9 '@vitest/ui': specifier: ^3.2.4 - version: 3.2.4(vitest@4.0.15) + version: 3.2.4(vitest@4.0.17) fm-odata-client: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.0.2 + version: 3.0.2 publint: specifier: ^0.3.16 version: 0.3.16 @@ -246,8 +252,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.19.3)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@25.0.6)(@vitest/ui@3.2.4)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages/cli: dependencies: @@ -255,7 +261,7 @@ importers: specifier: 1.1.17 version: 1.1.17 '@clack/core': - specifier: ^0.3.4 + specifier: ^0.3.5 version: 0.3.5 '@clack/prompts': specifier: ^0.11.0 @@ -270,32 +276,32 @@ importers: specifier: ^8.1.0 version: 8.1.0 axios: - specifier: ^1.7.3 - version: 1.9.0 + specifier: ^1.13.2 + version: 1.13.2 chalk: specifier: 5.4.1 version: 5.4.1 commander: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.0.2 + version: 14.0.2 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 es-toolkit: - specifier: ^1.38.0 - version: 1.38.0 + specifier: ^1.43.0 + version: 1.43.0 execa: - specifier: ^9.5.3 - version: 9.5.3 + specifier: ^9.6.1 + version: 9.6.1 fast-glob: specifier: ^3.3.3 version: 3.3.3 fs-extra: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^11.3.3 + version: 11.3.3 glob: - specifier: ^11.0.1 - version: 11.0.2 + specifier: ^11.1.0 + version: 11.1.0 gradient-string: specifier: ^2.0.2 version: 2.0.2 @@ -309,30 +315,30 @@ importers: specifier: ^3.3.1 version: 3.3.1 open: - specifier: ^10.1.0 - version: 10.1.2 + specifier: ^10.2.0 + version: 10.2.0 ora: specifier: 6.3.1 version: 6.3.1 randomstring: - specifier: ^1.3.0 + specifier: ^1.3.1 version: 1.3.1 semver: - specifier: ^7.7.2 - version: 7.7.2 + specifier: ^7.7.3 + version: 7.7.3 shadcn: specifier: ^2.10.0 - version: 2.10.0(@types/node@22.17.1)(typescript@5.9.3) + version: 2.10.0(@types/node@22.19.5)(hono@4.11.3)(typescript@5.9.3) sort-package-json: - specifier: ^2.10.0 + specifier: ^2.15.1 version: 2.15.1 ts-morph: specifier: ^26.0.0 version: 26.0.0 devDependencies: '@auth/drizzle-adapter': - specifier: ^1.1.0 - version: 1.9.1 + specifier: ^1.11.1 + version: 1.11.1 '@auth/prisma-adapter': specifier: ^1.6.0 version: 1.6.0(@prisma/client@5.22.0(prisma@5.22.0)) @@ -340,43 +346,43 @@ importers: specifier: 2.3.11 version: 2.3.11 '@libsql/client': - specifier: ^0.6.0 + specifier: ^0.6.2 version: 0.6.2 '@planetscale/database': - specifier: ^1.18.0 + specifier: ^1.19.0 version: 1.19.0 '@prisma/adapter-planetscale': - specifier: ^5.14.0 + specifier: ^5.22.0 version: 5.22.0(@planetscale/database@1.19.0) '@prisma/client': - specifier: ^5.14.0 + specifier: ^5.22.0 version: 5.22.0(prisma@5.22.0) '@proofkit/registry': specifier: workspace:* version: link:../registry '@rollup/plugin-replace': specifier: ^6.0.3 - version: 6.0.3(rollup@4.40.2) + version: 6.0.3(rollup@4.55.1) '@t3-oss/env-nextjs': specifier: ^0.10.1 version: 0.10.1(typescript@5.9.3)(zod@4.3.5) '@tanstack/react-query': - specifier: ^5.90.12 - version: 5.90.12(react@19.2.3) + specifier: ^5.90.16 + version: 5.90.16(react@19.2.3) '@trpc/client': specifier: 11.0.0-rc.441 version: 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/next': specifier: 11.0.0-rc.441 - version: 11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@trpc/server@11.0.0-rc.441)(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@trpc/server@11.0.0-rc.441)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@trpc/react-query': specifier: 11.0.0-rc.441 - version: 11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@trpc/server': specifier: 11.0.0-rc.441 version: 11.0.0-rc.441 '@types/axios': - specifier: ^0.14.0 + specifier: ^0.14.4 version: 0.14.4 '@types/fs-extra': specifier: ^11.0.4 @@ -385,8 +391,8 @@ importers: specifier: ^1.1.6 version: 1.1.6 '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 '@types/randomstring': specifier: ^1.3.0 version: 1.3.0 @@ -394,31 +400,31 @@ importers: specifier: 19.2.7 version: 19.2.7 '@types/semver': - specifier: ^7.7.0 - version: 7.7.0 + specifier: ^7.7.1 + version: 7.7.1 '@vitest/coverage-v8': - specifier: ^2.1.8 - version: 2.1.9(vitest@4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^2.1.9 + version: 2.1.9(vitest@4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) drizzle-kit: specifier: ^0.21.4 version: 0.21.4 drizzle-orm: specifier: ^0.30.10 - version: 0.30.10(@libsql/client@0.6.2)(@planetscale/database@1.19.0)(@types/better-sqlite3@7.6.13)(@types/react@19.2.7)(better-sqlite3@11.10.0)(kysely@0.28.2)(mysql2@3.14.1)(postgres@3.4.5)(react@19.2.3) + version: 0.30.10(@libsql/client@0.6.2)(@planetscale/database@1.19.0)(@types/better-sqlite3@7.6.13)(@types/react@19.2.7)(better-sqlite3@11.10.0)(kysely@0.28.9)(mysql2@3.16.0)(postgres@3.4.8)(react@19.2.3) mysql2: - specifier: ^3.9.7 - version: 3.14.1 + specifier: ^3.16.0 + version: 3.16.0 next: specifier: 16.1.1 - version: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) next-auth: - specifier: ^4.24.7 - version: 4.24.11(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^4.24.13 + version: 4.24.13(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) postgres: - specifier: ^3.4.4 - version: 3.4.5 + specifier: ^3.4.8 + version: 3.4.8 prisma: - specifier: ^5.14.0 + specifier: ^5.22.0 version: 5.22.0 publint: specifier: ^0.3.16 @@ -430,14 +436,14 @@ importers: specifier: 19.2.3 version: 19.2.3(react@19.2.3) superjson: - specifier: ^2.2.1 - version: 2.2.2 + specifier: ^2.2.6 + version: 2.2.6 tailwindcss: - specifier: ^4.1.11 - version: 4.1.11 + specifier: ^4.1.18 + version: 4.1.18 tsdown: specifier: ^0.14.2 - version: 0.14.2(publint@0.3.16)(typescript@5.9.3) + version: 0.14.2(oxc-resolver@11.16.2)(publint@0.3.16)(typescript@5.9.3) type-fest: specifier: ^3.13.1 version: 3.13.1 @@ -448,60 +454,60 @@ importers: specifier: 7.0.8 version: 7.0.8(typescript@5.9.3) vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 packages/create-proofkit: dependencies: execa: - specifier: ^9.5.3 - version: 9.5.3 + specifier: ^9.6.1 + version: 9.6.1 packages/fmdapi: dependencies: '@standard-schema/spec': - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.1.0 + version: 1.1.0 '@tanstack/vite-config': - specifier: ^0.2.0 - version: 0.2.0(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.2.1 + version: 0.2.1(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) chalk: specifier: 5.4.1 version: 5.4.1 commander: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.0.2 + version: 14.0.2 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 fs-extra: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^11.3.3 + version: 11.3.3 ts-morph: specifier: ^26.0.0 version: 26.0.0 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 devDependencies: '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 '@upstash/redis': - specifier: ^1.34.6 - version: 1.34.9 + specifier: ^1.36.1 + version: 1.36.1 knip: - specifier: ^5.56.0 - version: 5.56.0(@types/node@22.17.1)(typescript@5.9.3) + specifier: ^5.80.2 + version: 5.80.2(@types/node@22.19.5)(typescript@5.9.3) publint: specifier: ^0.3.16 version: 0.3.16 @@ -512,8 +518,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages/fmodata: dependencies: @@ -521,50 +527,50 @@ importers: specifier: ^4.2.0 version: 4.2.0 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 es-toolkit: - specifier: ^1.38.0 - version: 1.38.0 + specifier: ^1.43.0 + version: 1.43.0 neverthrow: specifier: ^8.2.0 version: 8.2.0 odata-query: - specifier: ^8.0.4 - version: 8.0.4 + specifier: ^8.0.7 + version: 8.0.7 devDependencies: '@standard-schema/spec': - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.1.0 + version: 1.1.0 '@tanstack/vite-config': - specifier: ^0.2.0 - version: 0.2.0(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) + specifier: ^0.2.1 + version: 0.2.1(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 fast-xml-parser: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.3.3 + version: 5.3.3 publint: specifier: ^0.3.16 version: 0.3.16 tsx: - specifier: ^4.19.2 - version: 4.20.3 + specifier: ^4.21.0 + version: 4.21.0 typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) + version: 4.5.4(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.20.3)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 packages/registry: @@ -572,16 +578,13 @@ importers: jiti: specifier: ^1.21.7 version: 1.21.7 - shadcn: - specifier: ^2.10.0 - version: 2.10.0(@types/node@22.19.3)(typescript@5.9.3) zod: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.3.5 + version: 4.3.5 devDependencies: '@vitest/coverage-v8': - specifier: ^2.1.8 - version: 2.1.9(vitest@4.0.15(@types/node@22.19.3)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^2.1.9 + version: 2.1.9(vitest@4.0.17(@types/node@25.0.6)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2)) chokidar-cli: specifier: ^3.0.0 version: 3.0.0 @@ -593,16 +596,16 @@ importers: version: 0.3.16 tsdown: specifier: ^0.14.2 - version: 0.14.2(publint@0.3.16)(typescript@5.9.3) + version: 0.14.2(oxc-resolver@11.16.2)(publint@0.3.16)(typescript@5.9.3) tsx: - specifier: ^4.19.2 + specifier: ^4.21.0 version: 4.21.0 typescript: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.19.3)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@25.0.6)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages/typegen: dependencies: @@ -611,13 +614,13 @@ importers: version: 0.11.0 '@commander-js/extra-typings': specifier: ^14.0.0 - version: 14.0.0(commander@14.0.0) + version: 14.0.0(commander@14.0.2) '@hono/node-server': - specifier: ^1.19.7 - version: 1.19.7(hono@4.9.0) + specifier: ^1.19.8 + version: 1.19.8(hono@4.11.3) '@hono/zod-validator': - specifier: ^0.7.5 - version: 0.7.5(hono@4.9.0)(zod@4.3.5) + specifier: ^0.7.6 + version: 0.7.6(hono@4.11.3)(zod@4.3.5) '@proofkit/fmdapi': specifier: workspace:* version: link:../fmdapi @@ -625,41 +628,41 @@ importers: specifier: workspace:* version: link:../fmodata '@tanstack/vite-config': - specifier: ^0.2.0 - version: 0.2.0(@types/node@22.19.3)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.2.1 + version: 0.2.1(@types/node@25.0.6)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) chalk: specifier: 5.4.1 version: 5.4.1 commander: - specifier: ^14.0.0 - version: 14.0.0 + specifier: ^14.0.2 + version: 14.0.2 dotenv: - specifier: ^16.5.0 - version: 16.5.0 + specifier: ^16.6.1 + version: 16.6.1 execa: - specifier: ^9.5.3 - version: 9.5.3 + specifier: ^9.6.1 + version: 9.6.1 fast-xml-parser: - specifier: ^5.3.2 - version: 5.3.2 + specifier: ^5.3.3 + version: 5.3.3 fs-extra: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^11.3.3 + version: 11.3.3 hono: - specifier: ^4.9.0 - version: 4.9.0 + specifier: ^4.11.3 + version: 4.11.3 jsonc-parser: specifier: ^3.3.1 version: 3.3.1 open: - specifier: ^10.1.0 - version: 10.1.2 + specifier: ^10.2.0 + version: 10.2.0 prettier: specifier: ^3.7.4 version: 3.7.4 semver: - specifier: ^7.7.2 - version: 7.7.2 + specifier: ^7.7.3 + version: 7.7.3 ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -667,18 +670,18 @@ importers: specifier: ^9.6.0 version: 9.6.0 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 devDependencies: '@types/fs-extra': specifier: ^11.0.4 version: 11.0.4 '@types/semver': - specifier: ^7.7.0 - version: 7.7.0 + specifier: ^7.7.1 + version: 7.7.1 concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -695,8 +698,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vitest: - specifier: ^4.0.7 - version: 4.0.15(@types/node@22.19.3)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + specifier: ^4.0.17 + version: 4.0.17(@types/node@25.0.6)(@vitest/ui@3.2.4)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) packages/typegen/web: dependencies: @@ -716,14 +719,14 @@ importers: specifier: ^4.2.0 version: 4.2.0 '@headless-tree/core': - specifier: ^1.6.0 - version: 1.6.0 + specifier: ^1.6.2 + version: 1.6.2 '@headless-tree/react': - specifier: ^1.6.0 - version: 1.6.0(@headless-tree/core@1.6.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.6.2 + version: 1.6.2(@headless-tree/core@1.6.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@hookform/resolvers': specifier: ^5.2.2 - version: 5.2.2(react-hook-form@7.68.0(react@19.2.3)) + version: 5.2.2(react-hook-form@7.71.0(react@19.2.3)) '@proofkit/typegen': specifier: workspace:* version: link:.. @@ -734,26 +737,26 @@ importers: specifier: ^1.1.1 version: 1.1.1(@types/react@19.2.7)(react@19.2.3) '@radix-ui/react-slot': - specifier: ^1.2.3 - version: 1.2.3(@types/react@19.2.7)(react@19.2.3) + specifier: ^1.2.4 + version: 1.2.4(@types/react@19.2.7)(react@19.2.3) '@radix-ui/react-tooltip': specifier: ^1.2.8 version: 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@remixicon/react': - specifier: ^4.7.0 - version: 4.7.0(react@19.2.3) + specifier: ^4.8.0 + version: 4.8.0(react@19.2.3) '@tailwindcss/vite': specifier: ^4.1.18 - version: 4.1.18(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.18(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@tanstack/react-query': - specifier: ^5.90.12 - version: 5.90.12(react@19.2.3) + specifier: ^5.90.16 + version: 5.90.16(react@19.2.3) '@tanstack/react-table': specifier: ^8.21.3 version: 8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-virtual': - specifier: ^3.13.13 - version: 3.13.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^3.13.18 + version: 3.13.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -767,8 +770,8 @@ importers: specifier: ^1.1.1 version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) hono: - specifier: ^4.9.0 - version: 4.9.0 + specifier: ^4.11.3 + version: 4.11.3 lucide-react: specifier: ^0.511.0 version: 0.511.0(react@19.2.3) @@ -782,27 +785,27 @@ importers: specifier: 19.2.3 version: 19.2.3(react@19.2.3) react-hook-form: - specifier: ^7.68.0 - version: 7.68.0(react@19.2.3) + specifier: ^7.71.0 + version: 7.71.0(react@19.2.3) sonner: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3) tailwind-merge: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.4.0 + version: 3.4.0 tailwindcss: - specifier: ^4.1.11 - version: 4.1.11 + specifier: ^4.1.18 + version: 4.1.18 zod: - specifier: ^4.2.0 + specifier: ^4.3.5 version: 4.3.5 devDependencies: '@tanstack/react-query-devtools': - specifier: ^5.91.1 - version: 5.91.1(@tanstack/react-query@5.90.12(react@19.2.3))(react@19.2.3) + specifier: ^5.91.2 + version: 5.91.2(@tanstack/react-query@5.90.16(react@19.2.3))(react@19.2.3) '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -810,17 +813,17 @@ importers: specifier: 19.2.3 version: 19.2.3(@types/react@19.2.7) '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.7.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^4.7.0 + version: 4.7.0(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) tw-animate-css: - specifier: ^1.3.6 - version: 1.3.6 + specifier: ^1.4.0 + version: 1.4.0 typescript: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) packages/webviewer: dependencies: @@ -835,20 +838,20 @@ importers: specifier: workspace:* version: link:../fmdapi '@tanstack/vite-config': - specifier: ^0.2.0 - version: 0.2.0(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^0.2.1 + version: 0.2.1(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) '@types/filemaker-webviewer': - specifier: ^1.0.0 + specifier: ^1.0.3 version: 1.0.3 '@types/node': - specifier: ^22.17.1 - version: 22.17.1 + specifier: ^22.19.5 + version: 22.19.5 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 knip: - specifier: ^5.56.0 - version: 5.56.0(@types/node@22.17.1)(typescript@5.9.3) + specifier: ^5.80.2 + version: 5.80.2(@types/node@22.19.5)(typescript@5.9.3) publint: specifier: ^0.3.16 version: 0.3.16 @@ -856,8 +859,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: ^6.3.4 - version: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + specifier: ^6.4.1 + version: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) packages: @@ -899,12 +902,12 @@ packages: nodemailer: optional: true - '@auth/core@0.39.1': - resolution: {integrity: sha512-McD8slui0oOA1pjR5sPjLPl5Zm//nLP/8T3kr8hxIsvNLvsiudYvPHhDFPjh1KcZ2nFxCkZmP6bRxaaPd/AnLA==} + '@auth/core@0.41.1': + resolution: {integrity: sha512-t9cJ2zNYAdWMacGRMT6+r4xr1uybIdmYa49calBPeTqwgAFPV/88ac9TEvCR85pvATiSPt8VaNf+Gt24JIT/uw==} peerDependencies: '@simplewebauthn/browser': ^9.0.1 '@simplewebauthn/server': ^9.0.2 - nodemailer: ^6.8.0 + nodemailer: ^7.0.7 peerDependenciesMeta: '@simplewebauthn/browser': optional: true @@ -913,8 +916,8 @@ packages: nodemailer: optional: true - '@auth/drizzle-adapter@1.9.1': - resolution: {integrity: sha512-WQ4vtDxpo3jAPfSLJbrjFx++/lMO1HJbV7ZwzCUBEkhqYMTrqQBJhLb+vcusDu95wiekVOUCPe1y6QSNbMeeYA==} + '@auth/drizzle-adapter@1.11.1': + resolution: {integrity: sha512-cQTvDZqsyF7RPhDm/B6SvqdVP9EzQhy3oM4Muu7fjjmSYFLbSR203E6dH631ZHSKDn2b4WZkfMnjPDzRsPSAeA==} '@auth/prisma-adapter@1.6.0': resolution: {integrity: sha512-PQU8/Oi5gfjzb0MkhMGVX0Dg877phPzsQdK54+C7ubukCeZPjyvuSAx1vVtWEYVWp2oQvjgG/C6QiDoeC7S10A==} @@ -925,22 +928,14 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.27.7': - resolution: {integrity: sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.27.7': - resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} '@babel/core@7.28.5': resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} @@ -953,8 +948,8 @@ packages: resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.27.1': - resolution: {integrity: sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==} + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -963,20 +958,14 @@ packages: resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.27.1': - resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.3': resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} @@ -1005,10 +994,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1017,19 +1002,10 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.27.6': - resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.3': - resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.28.5': resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} @@ -1053,8 +1029,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.27.1': - resolution: {integrity: sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==} + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -1089,28 +1065,24 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.27.1': - resolution: {integrity: sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==} + '@babel/plugin-transform-typescript@7.28.5': + resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-react@7.27.1': - resolution: {integrity: sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==} + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + '@babel/preset-typescript@7.28.5': + resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.27.1': - resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.4': resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} @@ -1119,22 +1091,10 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.7': - resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.27.7': - resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} @@ -1165,14 +1125,29 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@better-auth/utils@0.2.5': - resolution: {integrity: sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ==} + '@better-auth/core@1.4.11': + resolution: {integrity: sha512-BYKiYx5GVp5a4rIZXRJwCsDhpSRXd1mfcPn4AKXeuLhcKrurs4uWWN5iBFq+tJ2eNgAcs0WV5pFm/uoz0oFdQQ==} + peerDependencies: + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.21 + better-call: 1.1.7 + jose: ^6.1.0 + kysely: ^0.28.5 + nanostores: ^1.0.1 + + '@better-auth/telemetry@1.4.11': + resolution: {integrity: sha512-PUtmnBZ7QQpuQUmwMf8pQBUGKEutUC9s5TsJAhoR69crAqWHKZCfR48iN+/4C5JMs2mpO75Ygsi6h9yJ/UqAIg==} + peerDependencies: + '@better-auth/core': 1.4.11 + + '@better-auth/utils@0.3.0': + resolution: {integrity: sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw==} '@better-fetch/fetch@1.1.17': resolution: {integrity: sha512-MQonMalbmEshb+amuLtCkVjYliyyWrYXZkiMnHLgFjNEBsNBbZSY3+lYsFK1/VxePSupVkUW6xinqhqB3uHE1g==} - '@better-fetch/fetch@1.1.18': - resolution: {integrity: sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA==} + '@better-fetch/fetch@1.1.21': + resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} '@biomejs/biome@2.3.11': resolution: {integrity: sha512-/zt+6qazBWguPG6+eWmiELqO+9jRsMZ/DBU3lfuU2ngtIQYzymocHhKiZRyrbra4aCOoyTg/BmY+6WH5mv9xmQ==} @@ -1227,33 +1202,27 @@ packages: cpu: [x64] os: [win32] - '@braidai/lang@1.1.1': - resolution: {integrity: sha512-5uM+no3i3DafVgkoW7ayPhEGHNNBZCSj5TrGDQt0ayEKQda5f3lAXlmQg0MR5E0gKgmTzUUEtSWHsEC3h9jUcg==} - - '@bundled-es-modules/cookie@2.0.1': - resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + '@borewit/text-codec@0.2.1': + resolution: {integrity: sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==} - '@bundled-es-modules/statuses@1.0.1': - resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + '@braidai/lang@1.1.2': + resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} - '@bundled-es-modules/tough-cookie@0.1.6': - resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@changesets/apply-release-plan@7.0.14': + resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} - '@changesets/apply-release-plan@7.0.12': - resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - - '@changesets/assemble-release-plan@6.0.8': - resolution: {integrity: sha512-y8+8LvZCkKJdbUlpXFuqcavpzJR80PN0OIfn8HZdwK7Sh6MgLXm4hKY5vu6/NDoKp8lAlM4ERZCqRMLxP4m+MQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.4': - resolution: {integrity: sha512-VW30x9oiFp/un/80+5jLeWgEU6Btj8IqOgI+X/zAYu4usVOWXjPIK5jSSlt5jsCU7/6Z7AxEkarxBxGUqkAmNg==} + '@changesets/cli@2.29.8': + resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} hasBin: true - '@changesets/config@3.1.1': - resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} + '@changesets/config@3.1.2': + resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -1261,8 +1230,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.12': - resolution: {integrity: sha512-KukdEgaafnyGryUwpHG2kZ7xJquOmWWWk5mmoeQaSvZTWH1DC5D/Sw6ClgGFYtQnOMSQhgoEbDxAbpIIayKH1g==} + '@changesets/get-release-plan@4.0.14': + resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -1273,14 +1242,14 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.1': - resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} + '@changesets/parse@0.4.2': + resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.5': - resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} + '@changesets/read@0.6.6': + resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -1340,15 +1309,9 @@ packages: peerDependencies: react: '>=16.8.0' - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} - '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/runtime@1.8.1': resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} @@ -1369,20 +1332,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.4': - resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.25.8': - resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.27.1': - resolution: {integrity: sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1405,20 +1356,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.4': - resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.25.8': - resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.27.1': - resolution: {integrity: sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1441,20 +1380,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.4': - resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.8': - resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.27.1': - resolution: {integrity: sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1477,20 +1404,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.4': - resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.25.8': - resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.27.1': - resolution: {integrity: sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1513,20 +1428,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.4': - resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.8': - resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.27.1': - resolution: {integrity: sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1549,20 +1452,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.4': - resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.8': - resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.1': - resolution: {integrity: sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1585,20 +1476,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.4': - resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.8': - resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.27.1': - resolution: {integrity: sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1621,20 +1500,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.4': - resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.8': - resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.1': - resolution: {integrity: sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1657,20 +1524,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.4': - resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.25.8': - resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.27.1': - resolution: {integrity: sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1693,20 +1548,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.4': - resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.25.8': - resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.1': - resolution: {integrity: sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1729,20 +1572,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.4': - resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.8': - resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.27.1': - resolution: {integrity: sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1765,20 +1596,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.4': - resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.25.8': - resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.27.1': - resolution: {integrity: sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1801,20 +1620,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.4': - resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.25.8': - resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.1': - resolution: {integrity: sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1837,20 +1644,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.4': - resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.25.8': - resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.27.1': - resolution: {integrity: sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1873,20 +1668,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.4': - resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.8': - resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.1': - resolution: {integrity: sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1909,20 +1692,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.4': - resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.8': - resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.27.1': - resolution: {integrity: sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1945,20 +1716,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.4': - resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.8': - resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.1': - resolution: {integrity: sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1969,20 +1728,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.4': - resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.25.8': - resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.1': - resolution: {integrity: sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -2005,20 +1752,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.4': - resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.8': - resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.1': - resolution: {integrity: sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] @@ -2029,20 +1764,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.4': - resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.25.8': - resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.1': - resolution: {integrity: sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -2065,20 +1788,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.4': - resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.8': - resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.1': - resolution: {integrity: sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -2089,14 +1800,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.8': - resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.27.1': - resolution: {integrity: sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -2119,20 +1824,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.4': - resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.25.8': - resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.27.1': - resolution: {integrity: sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -2155,20 +1848,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.4': - resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.8': - resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.1': - resolution: {integrity: sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -2191,20 +1872,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.4': - resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.25.8': - resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.1': - resolution: {integrity: sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -2227,20 +1896,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.4': - resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.8': - resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.27.1': - resolution: {integrity: sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2254,24 +1911,12 @@ packages: '@fetchkit/ffetch@4.2.0': resolution: {integrity: sha512-OUpnod9/vhM0S6jQFLfOp+xnTy0wGQSKADg1+ZZ9oiJqCqYxEbOQ+OOJ/y9x/CBUc/j0BBw/930vndmpthwWjA==} - '@floating-ui/core@1.7.1': - resolution: {integrity: sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==} - '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/dom@1.7.1': - resolution: {integrity: sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==} - '@floating-ui/dom@1.7.4': resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - '@floating-ui/react-dom@2.1.3': - resolution: {integrity: sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - '@floating-ui/react-dom@2.1.6': resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} peerDependencies: @@ -2281,9 +1926,6 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} - '@formatjs/fast-memoize@3.0.3': resolution: {integrity: sha512-CArYtQKGLAOruCMeq5/RxCg6vUXFx3OuKBdTm30Wn/+gCefehmZ8Y2xSMxMrO2iel7hRyE3HKfV56t3vAU6D4Q==} @@ -2306,27 +1948,24 @@ packages: tailwindcss: optional: true - '@headless-tree/core@1.6.0': - resolution: {integrity: sha512-7wsRgAAeqLd3W2avMcYHcVRQR0fFZwDyl9Fj631UGSZStkJeEae+x/dNblVTFNKEb18PyJkC0i6A+7w5eBHWyQ==} + '@headless-tree/core@1.6.2': + resolution: {integrity: sha512-mDFcA6Gi7at9xwDAkI12mJXumniDv/KHR18nPhepI1Bi06zFnB7dUMEzPYY4DxHW7Ai1CPGuHVA7/Tlw8ht0kw==} - '@headless-tree/react@1.6.0': - resolution: {integrity: sha512-cpdqNOFMBZHawCz8SuRGcIwuXKOirFlJhRTAybL8kLTDu39UmmrnlODudVvOKC7WKegMUnkqAr51aoEqdMhTYw==} + '@headless-tree/react@1.6.2': + resolution: {integrity: sha512-NhVRGWlpXBQalByZLYms4H8LdmzZteWMsxfKQZoSXex1xpcumKdZ8MiTIH9W5PJogMnbkj2pyHMEaVqRZocKtA==} peerDependencies: '@headless-tree/core': '*' react: '*' react-dom: '*' - '@hexagon/base64@1.1.28': - resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} - - '@hono/node-server@1.19.7': - resolution: {integrity: sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw==} + '@hono/node-server@1.19.8': + resolution: {integrity: sha512-0/g2lIOPzX8f3vzW1ggQgvG5mjtFBDBHFAzI5SFAi2DzSqS9luJwqg9T6O/gKYLi+inS7eNxBeIFkkghIPvrMA==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 - '@hono/zod-validator@0.7.5': - resolution: {integrity: sha512-n4l4hutkfYU07PzRUHBOVzUEn38VSfrh+UVE5d0w4lyfWDOEhzxIupqo5iakRiJL44c3vTuFJBvcmUl8b9agIA==} + '@hono/zod-validator@0.7.6': + resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} peerDependencies: hono: '>=3.9.0' zod: ^3.25.0 || ^4.0.0 @@ -2473,8 +2112,21 @@ packages: cpu: [x64] os: [win32] - '@inquirer/confirm@5.1.12': - resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -2482,8 +2134,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.13': - resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -2491,12 +2143,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.12': - resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} engines: {node: '>=18'} - '@inquirer/type@3.0.7': - resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -2516,10 +2168,6 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -2539,10 +2187,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -2550,24 +2194,11 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - - '@levischuck/tiny-cbor@0.2.11': - resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@libsql/client@0.6.2': resolution: {integrity: sha512-xRNfRLv/dOCbV4qd+M0baQwGmvuZpMd2wG2UAPs8XmcdaPvu5ErkcaeITkxlm3hDEJVabQM1cFhMBxsugWW9fQ==} @@ -2635,15 +2266,15 @@ packages: '@microsoft/api-extractor-model@7.29.6': resolution: {integrity: sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==} - '@microsoft/api-extractor-model@7.32.1': - resolution: {integrity: sha512-u4yJytMYiUAnhcNQcZDTh/tVtlrzKlyKrQnLOV+4Qr/5gV+cpufWzCYAB1Q23URFqD6z2RoL2UYncM9xJVGNKA==} + '@microsoft/api-extractor-model@7.32.2': + resolution: {integrity: sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==} '@microsoft/api-extractor@7.47.7': resolution: {integrity: sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==} hasBin: true - '@microsoft/api-extractor@7.55.1': - resolution: {integrity: sha512-l8Z+8qrLkZFM3HM95Dbpqs6G39fpCa7O5p8A7AkA6hSevxkgwsOlLrEuPv0ADOyj5dI1Af5WVDiwpKG/ya5G3w==} + '@microsoft/api-extractor@7.55.2': + resolution: {integrity: sha512-1jlWO4qmgqYoVUcyh+oXYRztZde/pAi7cSVzBz/rc+S7CoVzDasy8QE13dx6sLG4VRo8SfkkLbFORR6tBw4uGQ==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -2658,17 +2289,20 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - '@modelcontextprotocol/sdk@1.17.2': - resolution: {integrity: sha512-EFLRNXR/ixpXQWu6/3Cu30ndDFIFNaqUXcTqsGebujeMan9FzhAaFFswLRiFj61rgygDRr8WO1N+UijjgRxX9g==} + '@modelcontextprotocol/sdk@1.25.2': + resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} engines: {node: '>=18'} + peerDependencies: + '@cfworker/json-schema': ^4.1.1 + zod: ^3.25 || ^4.0 + peerDependenciesMeta: + '@cfworker/json-schema': + optional: true - '@mswjs/interceptors@0.39.2': - resolution: {integrity: sha512-RuzCup9Ct91Y7V79xwCb146RaBRHZ7NBbrIUySumd1rpKqHL5OonaqrGIbug5hNwP/fRyxFMA6ISgw4FTtYFYg==} + '@mswjs/interceptors@0.40.0': + resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} @@ -2726,12 +2360,13 @@ packages: cpu: [x64] os: [win32] - '@noble/ciphers@0.6.0': - resolution: {integrity: sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ==} + '@noble/ciphers@2.1.1': + resolution: {integrity: sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==} + engines: {node: '>= 20.19.0'} - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.1': + resolution: {integrity: sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw==} + engines: {node: '>= 20.19.0'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -2758,136 +2393,152 @@ packages: resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} engines: {node: '>= 20.0.0'} - '@oxc-project/types@0.106.0': - resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} + '@oxc-project/types@0.107.0': + resolution: {integrity: sha512-QFDRbYfV2LVx8tyqtyiah3jQPUj1mK2+RYwxyFWyGoys6XJnwTdlzO6rdNNHOPorHAu5Uo34oWRKcvNpbJarmQ==} + + '@oxc-resolver/binding-android-arm-eabi@11.16.2': + resolution: {integrity: sha512-lVJbvydLQIDZHKUb6Zs9Rq80QVTQ9xdCQE30eC9/cjg4wsMoEOg65QZPymUAIVJotpUAWJD0XYcwE7ugfxx5kQ==} + cpu: [arm] + os: [android] + + '@oxc-resolver/binding-android-arm64@11.16.2': + resolution: {integrity: sha512-fEk+g/g2rJ6LnBVPqeLcx+/alWZ/Db1UlXG+ZVivip0NdrnOzRL48PAmnxTMGOrLwsH1UDJkwY3wOjrrQltCqg==} + cpu: [arm64] + os: [android] - '@oxc-resolver/binding-darwin-arm64@9.0.2': - resolution: {integrity: sha512-MVyRgP2gzJJtAowjG/cHN3VQXwNLWnY+FpOEsyvDepJki1SdAX/8XDijM1yN6ESD1kr9uhBKjGelC6h3qtT+rA==} + '@oxc-resolver/binding-darwin-arm64@11.16.2': + resolution: {integrity: sha512-Pkbp1qi7kdUX6k3Fk1PvAg6p7ruwaWKg1AhOlDgrg2vLXjtv9ZHo7IAQN6kLj0W771dPJZWqNxoqTPacp2oYWA==} cpu: [arm64] os: [darwin] - '@oxc-resolver/binding-darwin-x64@9.0.2': - resolution: {integrity: sha512-7kV0EOFEZ3sk5Hjy4+bfA6XOQpCwbDiDkkHN4BHHyrBHsXxUR05EcEJPPL1WjItefg+9+8hrBmoK0xRoDs41+A==} + '@oxc-resolver/binding-darwin-x64@11.16.2': + resolution: {integrity: sha512-FYCGcU1iSoPkADGLfQbuj0HWzS+0ItjDCt9PKtu2Hzy6T0dxO4Y1enKeCOxCweOlmLEkSxUlW5UPT4wvT3LnAg==} cpu: [x64] os: [darwin] - '@oxc-resolver/binding-freebsd-x64@9.0.2': - resolution: {integrity: sha512-6OvkEtRXrt8sJ4aVfxHRikjain9nV1clIsWtJ1J3J8NG1ZhjyJFgT00SCvqxbK+pzeWJq6XzHyTCN78ML+lY2w==} + '@oxc-resolver/binding-freebsd-x64@11.16.2': + resolution: {integrity: sha512-1zHCoK6fMcBjE54P2EG/z70rTjcRxvyKfvk4E/QVrWLxNahuGDFZIxoEoo4kGnnEcmPj41F0c2PkrQbqlpja5g==} cpu: [x64] os: [freebsd] - '@oxc-resolver/binding-linux-arm-gnueabihf@9.0.2': - resolution: {integrity: sha512-aYpNL6o5IRAUIdoweW21TyLt54Hy/ZS9tvzNzF6ya1ckOQ8DLaGVPjGpmzxdNja9j/bbV6aIzBH7lNcBtiOTkQ==} + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': + resolution: {integrity: sha512-+ucLYz8EO5FDp6kZ4o1uDmhoP+M98ysqiUW4hI3NmfiOJQWLrAzQjqaTdPfIOzlCXBU9IHp5Cgxu6wPjVb8dbA==} + cpu: [arm] + os: [linux] + + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': + resolution: {integrity: sha512-qq+TpNXyw1odDgoONRpMLzH4hzhwnEw55398dL8rhKGvvYbio71WrJ00jE+hGlEi7H1Gkl11KoPJRaPlRAVGPw==} cpu: [arm] os: [linux] - '@oxc-resolver/binding-linux-arm64-gnu@9.0.2': - resolution: {integrity: sha512-RGFW4vCfKMFEIzb9VCY0oWyyY9tR1/o+wDdNePhiUXZU4SVniRPQaZ1SJ0sUFI1k25pXZmzQmIP6cBmazi/Dew==} + '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': + resolution: {integrity: sha512-xlMh4gNtplNQEwuF5icm69udC7un0WyzT5ywOeHrPMEsghKnLjXok2wZgAA7ocTm9+JsI+nVXIQa5XO1x+HPQg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-arm64-musl@9.0.2': - resolution: {integrity: sha512-lxx/PibBfzqYvut2Y8N2D0Ritg9H8pKO+7NUSJb9YjR/bfk2KRmP8iaUz3zB0JhPtf/W3REs65oKpWxgflGToA==} + '@oxc-resolver/binding-linux-arm64-musl@11.16.2': + resolution: {integrity: sha512-OZs33QTMi0xmHv/4P0+RAKXJTBk7UcMH5tpTaCytWRXls/DGaJ48jOHmriQGK2YwUqXl+oneuNyPOUO0obJ+Hg==} cpu: [arm64] os: [linux] - '@oxc-resolver/binding-linux-riscv64-gnu@9.0.2': - resolution: {integrity: sha512-yD28ptS/OuNhwkpXRPNf+/FvrO7lwURLsEbRVcL1kIE0GxNJNMtKgIE4xQvtKDzkhk6ZRpLho5VSrkkF+3ARTQ==} + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': + resolution: {integrity: sha512-UVyuhaV32dJGtF6fDofOcBstg9JwB2Jfnjfb8jGlu3xcG+TsubHRhuTwQ6JZ1sColNT1nMxBiu7zdKUEZi1kwg==} + cpu: [ppc64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': + resolution: {integrity: sha512-YZZS0yv2q5nE1uL/Fk4Y7m9018DSEmDNSG8oJzy1TJjA1jx5HL52hEPxi98XhU6OYhSO/vC1jdkJeE8TIHugug==} + cpu: [riscv64] + os: [linux] + + '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': + resolution: {integrity: sha512-9VYuypwtx4kt1lUcwJAH4dPmgJySh4/KxtAPdRoX2BTaZxVm/yEXHq0mnl/8SEarjzMvXKbf7Cm6UBgptm3DZw==} cpu: [riscv64] os: [linux] - '@oxc-resolver/binding-linux-s390x-gnu@9.0.2': - resolution: {integrity: sha512-WBwEJdspoga2w+aly6JVZeHnxuPVuztw3fPfWrei2P6rNM5hcKxBGWKKT6zO1fPMCB4sdDkFohGKkMHVV1eryQ==} + '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': + resolution: {integrity: sha512-3gbwQ+xlL5gpyzgSDdC8B4qIM4mZaPDLaFOi3c/GV7CqIdVJc5EZXW4V3T6xwtPBOpXPXfqQLbhTnUD4SqwJtA==} cpu: [s390x] os: [linux] - '@oxc-resolver/binding-linux-x64-gnu@9.0.2': - resolution: {integrity: sha512-a2z3/cbOOTUq0UTBG8f3EO/usFcdwwXnCejfXv42HmV/G8GjrT4fp5+5mVDoMByH3Ce3iVPxj1LmS6OvItKMYQ==} + '@oxc-resolver/binding-linux-x64-gnu@11.16.2': + resolution: {integrity: sha512-m0WcK0j54tSwWa+hQaJMScZdWneqE7xixp/vpFqlkbhuKW9dRHykPAFvSYg1YJ3MJgu9ZzVNpYHhPKJiEQq57Q==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-linux-x64-musl@9.0.2': - resolution: {integrity: sha512-bHZF+WShYQWpuswB9fyxcgMIWVk4sZQT0wnwpnZgQuvGTZLkYJ1JTCXJMtaX5mIFHf69ngvawnwPIUA4Feil0g==} + '@oxc-resolver/binding-linux-x64-musl@11.16.2': + resolution: {integrity: sha512-ZjUm3w96P2t47nWywGwj1A2mAVBI/8IoS7XHhcogWCfXnEI3M6NPIRQPYAZW4s5/u3u6w1uPtgOwffj2XIOb/g==} cpu: [x64] os: [linux] - '@oxc-resolver/binding-wasm32-wasi@9.0.2': - resolution: {integrity: sha512-I5cSgCCh5nFozGSHz+PjIOfrqW99eUszlxKLgoNNzQ1xQ2ou9ZJGzcZ94BHsM9SpyYHLtgHljmOZxCT9bgxYNA==} + '@oxc-resolver/binding-openharmony-arm64@11.16.2': + resolution: {integrity: sha512-OFVQ2x3VenTp13nIl6HcQ/7dmhFmM9dg2EjKfHcOtYfrVLQdNR6THFU7GkMdmc8DdY1zLUeilHwBIsyxv5hkwQ==} + cpu: [arm64] + os: [openharmony] + + '@oxc-resolver/binding-wasm32-wasi@11.16.2': + resolution: {integrity: sha512-+O1sY3RrGyA2AqDnd3yaDCsqZqCblSTEpY7TbbaOaw0X7iIbGjjRLdrQk9StG3QSiZuBy9FdFwotIiSXtwvbAQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-resolver/binding-win32-arm64-msvc@9.0.2': - resolution: {integrity: sha512-5IhoOpPr38YWDWRCA5kP30xlUxbIJyLAEsAK7EMyUgqygBHEYLkElaKGgS0X5jRXUQ6l5yNxuW73caogb2FYaw==} + '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': + resolution: {integrity: sha512-jMrMJL+fkx6xoSMFPOeyQ1ctTFjavWPOSZEKUY5PebDwQmC9cqEr4LhdTnGsOtFrWYLXlEU4xWeMdBoc/XKkOA==} cpu: [arm64] os: [win32] - '@oxc-resolver/binding-win32-x64-msvc@9.0.2': - resolution: {integrity: sha512-Qc40GDkaad9rZksSQr2l/V9UubigIHsW69g94Gswc2sKYB3XfJXfIfyV8WTJ67u6ZMXsZ7BH1msSC6Aen75mCg==} + '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': + resolution: {integrity: sha512-tl0xDA5dcQplG2yg2ZhgVT578dhRFafaCfyqMEAXq8KNpor85nJ53C3PLpfxD2NKzPioFgWEexNsjqRi+kW2Mg==} + cpu: [ia32] + os: [win32] + + '@oxc-resolver/binding-win32-x64-msvc@11.16.2': + resolution: {integrity: sha512-M7z0xjYQq1HdJk2DxTSLMvRMyBSI4wn4FXGcVQBsbAihgXevAReqwMdb593nmCK/OiFwSNcOaGIzUvzyzQ+95w==} cpu: [x64] os: [win32] - '@oxlint/darwin-arm64@1.37.0': - resolution: {integrity: sha512-qDa8qf4Th3sbk6P6wRbsv5paGeZ8EEOy8PtnT2IkAYSzjDHavw8nMK/lQvf6uS7LArjcmOfM1Y3KnZUFoNZZqg==} + '@oxlint/darwin-arm64@1.39.0': + resolution: {integrity: sha512-lT3hNhIa02xCujI6YGgjmYGg3Ht/X9ag5ipUVETaMpx5Rd4BbTNWUPif1WN1YZHxt3KLCIqaAe7zVhatv83HOQ==} cpu: [arm64] os: [darwin] - '@oxlint/darwin-x64@1.37.0': - resolution: {integrity: sha512-FM0h0KyOQ4HCdhIX1ne6d80BxRra75h1ORce0jYNwQ49HT4RU8+9ywSMC7rQ79xWsmaahvkQPB7tMPyfjsQwAg==} + '@oxlint/darwin-x64@1.39.0': + resolution: {integrity: sha512-UT+rfTWd+Yr7iJeSLd/7nF8X4gTYssKh+n77hxl6Oilp3NnG1CKRHxZDy3o3lIBnwgzJkdyUAiYWO1bTMXQ1lA==} cpu: [x64] os: [darwin] - '@oxlint/linux-arm64-gnu@1.37.0': - resolution: {integrity: sha512-2axK0lftGwM6Q7wOuY2sassUqa4MKrG3iemVVyEpXzJ6g5QosxhCoFPp9v81/gmLT5kAdd2gskoDcfpDJliDNw==} + '@oxlint/linux-arm64-gnu@1.39.0': + resolution: {integrity: sha512-qocBkvS2V6rH0t9AT3DfQunMnj3xkM7srs5/Ycj2j5ZqMoaWd/FxHNVJDFP++35roKSvsRJoS0mtA8/77jqm6Q==} cpu: [arm64] os: [linux] - '@oxlint/linux-arm64-musl@1.37.0': - resolution: {integrity: sha512-f3YROyGMIdUeXx0yD7RsAUBzBvD222D4l2GQRYF3AMxyp9mya17Rq/3wNLR4JDnAnboOul3DAEKNm+09lo3uZw==} + '@oxlint/linux-arm64-musl@1.39.0': + resolution: {integrity: sha512-arZzAc1PPcz9epvGBBCMHICeyQloKtHX3eoOe62B3Dskn7gf6Q14wnDHr1r9Vp4vtcBATNq6HlKV14smdlC/qA==} cpu: [arm64] os: [linux] - '@oxlint/linux-x64-gnu@1.37.0': - resolution: {integrity: sha512-FANOdOVQ2c4acYLM0dvtSoKELHSSnDBxDdm8OlXNzSRanQILrNpLgUqCXHFsfiHipFfNzz3Z417PxV6X4aBYog==} + '@oxlint/linux-x64-gnu@1.39.0': + resolution: {integrity: sha512-ZVt5qsECpuNprdWxAPpDBwoixr1VTcZ4qAEQA2l/wmFyVPDYFD3oBY/SWACNnWBddMrswjTg9O8ALxYWoEpmXw==} cpu: [x64] os: [linux] - '@oxlint/linux-x64-musl@1.37.0': - resolution: {integrity: sha512-eYnSKT9knXdOQ9h+6nSjEHSx0+pW8PkGwtMNGXtCYR+/ZPKYIbtZVS0nZsFy+qizP+TRVSJrgc/JY3Xr0wjcQg==} + '@oxlint/linux-x64-musl@1.39.0': + resolution: {integrity: sha512-pB0hlGyKPbxr9NMIV783lD6cWL3MpaqnZRM9MWni4yBdHPTKyFNYdg5hGD0Bwg+UP4S2rOevq/+OO9x9Bi7E6g==} cpu: [x64] os: [linux] - '@oxlint/win32-arm64@1.37.0': - resolution: {integrity: sha512-2oHxNc4jcocfNWGWVVWQdEG+reZ5ncBZsmDoICJQ1rbCDx4Yimx8VUf1Ub9cCoJRcPiSLBxMqaeMaDClKixJIQ==} + '@oxlint/win32-arm64@1.39.0': + resolution: {integrity: sha512-Gg2SFaJohI9+tIQVKXlPw3FsPQFi/eCSWiCgwPtPn5uzQxHRTeQEZKuluz1fuzR5U70TXubb2liZi4Dgl8LJQA==} cpu: [arm64] os: [win32] - '@oxlint/win32-x64@1.37.0': - resolution: {integrity: sha512-w+pBuTjGmGCGPhDjFhj/97K2tlGyq5LKAU6S7FHxROPuJRWJD6uio1L75Lsb8fKhwtw2rm54LLOX30Yi+nILxw==} + '@oxlint/win32-x64@1.39.0': + resolution: {integrity: sha512-sbi25lfj74hH+6qQtb7s1wEvd1j8OQbTaH8v3xTcDjrwm579Cyh0HBv1YSZ2+gsnVwfVDiCTL1D0JsNqYXszVA==} cpu: [x64] os: [win32] '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} - '@peculiar/asn1-android@2.3.16': - resolution: {integrity: sha512-a1viIv3bIahXNssrOIkXZIlI2ePpZaNmR30d4aBL99mu2rO+mT9D6zBsp7H6eROWGtmwv0Ionp5olJurIo09dw==} - - '@peculiar/asn1-ecc@2.3.15': - resolution: {integrity: sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA==} - - '@peculiar/asn1-rsa@2.3.15': - resolution: {integrity: sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg==} - - '@peculiar/asn1-schema@2.3.15': - resolution: {integrity: sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w==} - - '@peculiar/asn1-x509@2.3.15': - resolution: {integrity: sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@planetscale/database@1.19.0': resolution: {integrity: sha512-Tv4jcFUFAFjOWrGSio49H6R2ijALv0ZzVBfJKIdm+kl9X046Fh4LLawrF9OMsglVbK6ukqMJsUCeucGAFTBcMA==} engines: {node: '>=16'} @@ -3336,6 +2987,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.1.4': + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-progress@1.1.7': resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} peerDependencies: @@ -3414,6 +3078,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-separator@1.1.8': + resolution: {integrity: sha512-sDvqVY4itsKwwSMEe0jtKgfTh+72Sy3gPmQpjqcQneqQ4PFmr/1I0YA+2/puilhggCe2gJcx5EBAYFkWkdpa5g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slider@1.3.6': resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} peerDependencies: @@ -3633,84 +3310,84 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@remixicon/react@4.7.0': - resolution: {integrity: sha512-ODBQjdbOjnFguCqctYkpDjERXOInNaBnRPDKfZOBvbzExBAwr2BaH/6AHFTg/UAFzBDkwtylfMT8iKPAkLwPLQ==} + '@remixicon/react@4.8.0': + resolution: {integrity: sha512-cbzR04GKWa3zWdgn0C2i+u/avb167iWeu9gqFO00UGu84meARPAm3oKowDZTU6dlk/WS3UHo6k//LMRM1l7CRw==} peerDependencies: react: '>=18.2.0' - '@rolldown/binding-android-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} + '@rolldown/binding-android-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-6yLLgyswYwiCfls9+hoNFY9F8TQdwo15hpXDHzlAR0X/GojeKF+AuNcXjYNbOJ4zjl/5D6lliE8CbpB5t1OWIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-hqGXRc162qCCIOAcHN2Cw4eXiVTwYsMFLOhAy1IG2CxY+dwc/l4Ga+dLPkLor3Ikqy5WDn+7kxHbbh6EmshEpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.58': - resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} + '@rolldown/binding-darwin-x64@1.0.0-beta.59': + resolution: {integrity: sha512-ezvvGuhteE15JmMhJW0wS7BaXmhwLy1YHeEwievYaPC1PgGD86wgBKfOpHr9tSKllAXbCe0BeeMvasscWLhKdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': - resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': + resolution: {integrity: sha512-4fhKVJiEYVd5n6no/mrL3LZ9kByfCGwmONOrdtvx8DJGDQhehH/q3RfhG3V/4jGKhpXgbDjpIjkkFdybCTcgew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': - resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': + resolution: {integrity: sha512-T3Y52sW6JAhvIqArBw+wtjNU1Ieaz4g0NBxyjSJoW971nZJBZygNlSYx78G4cwkCmo1dYTciTPDOnQygLV23pA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-NIW40jQDSQap2KDdmm9z3B/4OzWJ6trf8dwx3FD74kcQb3v34ThsBFTtzE5KjDuxnxgUlV+DkAu+XgSMKrgufw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-CCKEk+H+8c0WGe/8n1E20n85Tq4Pv+HNAbjP1KfUXW+01aCWSMjU56ChNrM2tvHnXicfm7QRNoZyfY8cWh7jLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': + resolution: {integrity: sha512-VlfwJ/HCskPmQi8R0JuAFndySKVFX7yPhE658o27cjSDWWbXVtGkSbwaxstii7Q+3Rz87ZXN+HLnb1kd4R9Img==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': + resolution: {integrity: sha512-kuO92hTRyGy0Ts3Nsqll0rfO8eFsEJe9dGQGktkQnZ2hrJrDVN0y419dMgKy/gB2S2o7F2dpWhpfQOBehZPwVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': + resolution: {integrity: sha512-PXAebvNL4sYfCqi8LdY4qyFRacrRoiPZLo3NoUmiTxm7MPtYYR8CNtBGNokqDmMuZIQIecRaD/jbmFAIDz7DxQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': - resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': + resolution: {integrity: sha512-yJoklQg7XIZq8nAg0bbkEXcDK6sfpjxQGxpg2Nd6ERNtvg+eOaEBRgPww0BVTrYFQzje1pB5qPwC2VnJHT3koQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-ljZ4+McmCbIuZwEBaoGtiG8Rq2nJjaXEnLEIx+usWetXn1ECjXY0LAhkELxOV6ytv4ensEmoJJ8nXg47hRMjlw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': + resolution: {integrity: sha512-bMY4tTIwbdZljW+xe/ln1hvs0SRitahQSXfWtvgAtIzgSX9Ar7KqJzU7lRm33YTRFIHLULRi53yNjw9nJGd6uQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3718,8 +3395,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.58': - resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} + '@rolldown/pluginutils@1.0.0-beta.59': + resolution: {integrity: sha512-aoh6LAJRyhtazs98ydgpNOYstxUlsOV1KJXcpf/0c0vFcUA8uyd/hwKRhqE/AAPNqAho9RliGsvitCoOzREoVA==} '@rollup/plugin-replace@6.0.3': resolution: {integrity: sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA==} @@ -3730,8 +3407,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -3739,108 +3416,133 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.2': - resolution: {integrity: sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==} + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.2': - resolution: {integrity: sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==} + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.2': - resolution: {integrity: sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==} + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.2': - resolution: {integrity: sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==} + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.2': - resolution: {integrity: sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==} + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.2': - resolution: {integrity: sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==} + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': - resolution: {integrity: sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.2': - resolution: {integrity: sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==} + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.2': - resolution: {integrity: sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==} + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.2': - resolution: {integrity: sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==} + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': - resolution: {integrity: sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==} + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.55.1': + resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': - resolution: {integrity: sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==} + '@rollup/rollup-linux-ppc64-gnu@4.55.1': + resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.2': - resolution: {integrity: sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==} + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.2': - resolution: {integrity: sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==} + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.2': - resolution: {integrity: sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==} + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.2': - resolution: {integrity: sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.2': - resolution: {integrity: sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==} + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.2': - resolution: {integrity: sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==} + '@rollup/rollup-openbsd-x64@4.55.1': + resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.55.1': + resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.2': - resolution: {integrity: sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.2': - resolution: {integrity: sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} cpu: [x64] os: [win32] - '@rushstack/node-core-library@5.19.0': - resolution: {integrity: sha512-BxAopbeWBvNJ6VGiUL+5lbJXywTdsnMeOS8j57Cn/xY10r6sV/gbsTlfYKjzVCUBZATX2eRzJHSMCchsMTGN6A==} + '@rushstack/node-core-library@5.19.1': + resolution: {integrity: sha512-ESpb2Tajlatgbmzzukg6zyAhH+sICqJR2CNXNhXcEbz6UGCQfrKCtkxOpJTftWc8RGouroHG0Nud1SJAszvpmA==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -3877,8 +3579,8 @@ packages: '@types/node': optional: true - '@rushstack/terminal@0.19.4': - resolution: {integrity: sha512-f4XQk02CrKfrMgyOfhYd3qWI944dLC21S4I/LUhrlAP23GTMDNG6EK5effQtFkISwUKCgD9vMBrJZaPSUquxWQ==} + '@rushstack/terminal@0.19.5': + resolution: {integrity: sha512-6k5tpdB88G0K7QrH/3yfKO84HK9ggftfUZ51p7fePyCE7+RLLHkWZbID9OFWbXuna+eeCFE7AkKnRMHMxNbz7Q==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -3888,8 +3590,8 @@ packages: '@rushstack/ts-command-line@4.22.6': resolution: {integrity: sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==} - '@rushstack/ts-command-line@5.1.4': - resolution: {integrity: sha512-H0I6VdJ6sOUbktDFpP2VW5N29w8v4hRoNZOQz02vtEi6ZTYL1Ju8u+TcFiFawUDrUsx/5MQTUhd79uwZZVwVlA==} + '@rushstack/ts-command-line@5.1.5': + resolution: {integrity: sha512-YmrFTFUdHXblYSa+Xc9OO9FsL/XFcckZy0ycQ6q7VSBsVs5P0uD9vcges5Q9vctGlVdu27w+Ct6IuJ458V0cTQ==} '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} @@ -3897,8 +3599,8 @@ packages: '@shikijs/core@3.13.0': resolution: {integrity: sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==} - '@shikijs/core@3.20.0': - resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} + '@shikijs/core@3.21.0': + resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} '@shikijs/engine-javascript@3.13.0': resolution: {integrity: sha512-Ty7xv32XCp8u0eQt8rItpMs6rU9Ki6LJ1dQOW3V/56PKDcpvfHPnYFbsx5FFUP2Yim34m/UkazidamMNVR4vKg==} @@ -3909,17 +3611,17 @@ packages: '@shikijs/langs@3.13.0': resolution: {integrity: sha512-672c3WAETDYHwrRP0yLy3W1QYB89Hbpj+pO4KhxK6FzIrDI2FoEXNiNCut6BQmEApYLfuYfpgOZaqbY+E9b8wQ==} - '@shikijs/rehype@3.20.0': - resolution: {integrity: sha512-/sqob3V/lJK0m2mZ64nkcWPN88im0D9atkI3S3PUBvtJZTHnJXVwZhHQFRDyObgEIa37IpHYHR3CuFtXB5bT2g==} + '@shikijs/rehype@3.21.0': + resolution: {integrity: sha512-fTQvwsZL67QdosMFdTgQ5SNjW3nxaPplRy//312hqOctRbIwviTV0nAbhv3NfnztHXvFli2zLYNKsTz/f9tbpQ==} '@shikijs/themes@3.13.0': resolution: {integrity: sha512-Vxw1Nm1/Od8jyA7QuAenaV78BG2nSr3/gCGdBkLpfLscddCkzkL36Q5b67SrLLfvAJTOUzW39x4FHVCFriPVgg==} - '@shikijs/transformers@3.20.0': - resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} + '@shikijs/transformers@3.21.0': + resolution: {integrity: sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA==} - '@shikijs/twoslash@3.20.0': - resolution: {integrity: sha512-fZz6vB9a0M8iuVF/ydIV4ToC09sbOh/TqxXZFWAh5J8bLiPsyQGtygKMDQ9L0Sdop3co0TIC/JsrLmsbmZwwsw==} + '@shikijs/twoslash@3.21.0': + resolution: {integrity: sha512-iH360udAYON2JwfIldoCiMZr9MljuQA5QRBivKLpEuEpmVCSwrR+0WTQ0eS1ptgGBdH9weFiIsA5wJDzsEzTYg==} peerDependencies: typescript: '>=5.5.0' @@ -3929,13 +3631,6 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@simplewebauthn/browser@13.1.0': - resolution: {integrity: sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg==} - - '@simplewebauthn/server@13.1.1': - resolution: {integrity: sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA==} - engines: {node: '>=20.0.0'} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -3947,9 +3642,6 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} - '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -3977,48 +3669,27 @@ packages: typescript: optional: true - '@tabler/icons-react@3.34.1': - resolution: {integrity: sha512-Ld6g0NqOO05kyyHsfU8h787PdHBm7cFmOycQSIrGp45XcXYDuOK2Bs0VC4T2FWSKZ6bx5g04imfzazf/nqtk1A==} + '@tabler/icons-react@3.36.1': + resolution: {integrity: sha512-/8nOXeNeMoze9xY/QyEKG65wuvRhkT3q9aytaur6Gj8bYU2A98YVJyLc9MRmc5nVvpy+bRlrrwK/Ykr8WGyUWg==} peerDependencies: react: '>= 16' - '@tabler/icons@3.34.1': - resolution: {integrity: sha512-9gTnUvd7Fd/DmQgr3MKY+oJLa1RfNsQo8c/ir3TJAWghOuZXodbtbVp0QBY2DxWuuvrSZFys0HEbv1CoiI5y6A==} - - '@tailwindcss/node@4.1.11': - resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + '@tabler/icons@3.36.1': + resolution: {integrity: sha512-f4Jg3Fof/Vru5ioix/UO4GX+sdDsF9wQo47FbtvG+utIYYVQ/QVAC0QYgcBbAjQGfbdOh2CCf0BgiFOF9Ixtjw==} '@tailwindcss/node@4.1.18': resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} - '@tailwindcss/oxide-android-arm64@4.1.11': - resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [android] - '@tailwindcss/oxide-android-arm64@4.1.18': resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.11': - resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@tailwindcss/oxide-darwin-arm64@4.1.18': resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.1.11': - resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} - engines: {node: '>= 10'} - cpu: [x64] + cpu: [arm64] os: [darwin] '@tailwindcss/oxide-darwin-x64@4.1.18': @@ -4027,90 +3698,42 @@ packages: cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.11': - resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - '@tailwindcss/oxide-freebsd-x64@4.1.18': resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} - engines: {node: '>= 10'} - cpu: [arm] - os: [linux] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.18': resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - '@tailwindcss/oxide-wasm32-wasi@4.1.18': resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} engines: {node: '>=14.0.0'} @@ -4123,60 +3746,44 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.11': - resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} - engines: {node: '>= 10'} - '@tailwindcss/oxide@4.1.18': resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} engines: {node: '>= 10'} - '@tailwindcss/postcss@4.1.11': - resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} + '@tailwindcss/postcss@4.1.18': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} '@tailwindcss/vite@4.1.18': resolution: {integrity: sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^6.4.1 - '@tanstack/query-core@5.90.12': - resolution: {integrity: sha512-T1/8t5DhV/SisWjDnaiU2drl6ySvsHj1bHBCWNXd+/T+Hh1cf6JodyEYMd5sgwm+b/mETT4EV3H+zCVczCU5hg==} + '@tanstack/query-core@5.90.16': + resolution: {integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==} - '@tanstack/query-devtools@5.91.1': - resolution: {integrity: sha512-l8bxjk6BMsCaVQH6NzQEE/bEgFy1hAs5qbgXl0xhzezlaQbPk6Mgz9BqEg2vTLPOHD8N4k+w/gdgCbEzecGyNg==} + '@tanstack/query-devtools@5.92.0': + resolution: {integrity: sha512-N8D27KH1vEpVacvZgJL27xC6yPFUy0Zkezn5gnB3L3gRCxlDeSuiya7fKge8Y91uMTnC8aSxBQhcK6ocY7alpQ==} - '@tanstack/react-query-devtools@5.91.1': - resolution: {integrity: sha512-tRnJYwEbH0kAOuToy8Ew7bJw1lX3AjkkgSlf/vzb+NpnqmHPdWM+lA2DSdGQSLi1SU0PDRrrCI1vnZnci96CsQ==} + '@tanstack/react-query-devtools@5.91.2': + resolution: {integrity: sha512-ZJ1503ay5fFeEYFUdo7LMNFzZryi6B0Cacrgr2h1JRkvikK1khgIq6Nq2EcblqEdIlgB/r7XDW8f8DQ89RuUgg==} peerDependencies: - '@tanstack/react-query': ^5.90.10 + '@tanstack/react-query': ^5.90.14 react: ^18 || ^19 - '@tanstack/react-query@5.90.12': - resolution: {integrity: sha512-graRZspg7EoEaw0a8faiUASCyJrqjKPdqJ9EwuDRUF9mEYJ1YPczI9H+/agJ0mOJkPCJDk0lsz5QTrLZ/jQ2rg==} + '@tanstack/react-query@5.90.16': + resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} peerDependencies: react: ^18 || ^19 @@ -4187,8 +3794,8 @@ packages: react: '>=16.8' react-dom: '>=16.8' - '@tanstack/react-virtual@3.13.13': - resolution: {integrity: sha512-4o6oPMDvQv+9gMi8rE6gWmsOjtUZUYIJHv7EB+GblyYdi8U6OqLl8rhHWIUZSL1dUU2dPwTdTgybCKf9EjIrQg==} + '@tanstack/react-virtual@3.13.18': + resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -4197,11 +3804,11 @@ packages: resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} - '@tanstack/virtual-core@3.13.13': - resolution: {integrity: sha512-uQFoSdKKf5S8k51W5t7b2qpfkyIbdHMzAn+AMQvHPxKUPeo1SsGaA4JRISQT87jm28b7z8OEqPcg1IOZagQHcA==} + '@tanstack/virtual-core@3.13.18': + resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} - '@tanstack/vite-config@0.2.0': - resolution: {integrity: sha512-WpL1C9iR5/U7g3GpvHIssN5QvKnDnWhW05BQhaD6bAqoPCkQyBepxUF8ZRO4IGZRGVAZeMVqTbUA05BAQH/88g==} + '@tanstack/vite-config@0.2.1': + resolution: {integrity: sha512-werDRwJSqzY28fbOBQ+wP7pQ6jl6Y+EJ8mA/dABOJEq2iBbGLXAzGPywRji7x4zULhjBDS3chQrR3nE7NVcoDw==} engines: {node: '>=18'} '@tokenizer/token@0.3.0': @@ -4279,8 +3886,8 @@ packages: '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -4294,9 +3901,6 @@ packages: '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -4345,11 +3949,14 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.17.1': - resolution: {integrity: sha512-y3tBaz+rjspDTylNjAX37jEC3TETEFGNJL6uQDxwF9/8GLLIjW1rvVHlynyuUKMnMr1Roq8jOv3vkopBjC4/VA==} + '@types/node@20.19.28': + resolution: {integrity: sha512-VyKBr25BuFDzBFCK5sUM6ZXiWfqgCTwTAOK8qzGV/m9FCirXYDlmczJ+d5dXBAQALGCdRRdbteKYfJ84NGEusw==} + + '@types/node@22.19.5': + resolution: {integrity: sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==} - '@types/node@22.19.3': - resolution: {integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==} + '@types/node@25.0.6': + resolution: {integrity: sha512-NNu0sjyNxpoiW3YuVFfNz7mxSQ+S4X2G28uqg2s+CzoqoQjLPsWSbsFFyztIAqt2vb8kfEAsJNepMGPTxFDx3Q==} '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} @@ -4365,8 +3972,8 @@ packages: '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -4377,9 +3984,6 @@ packages: '@types/tinycolor2@1.4.6': resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==} - '@types/tough-cookie@4.0.5': - resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} - '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -4389,19 +3993,17 @@ packages: '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/whatwg-mimetype@3.0.2': + resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.33': - resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} - peerDependencies: - typescript: '*' + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} '@typescript/vfs@1.6.2': resolution: {integrity: sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g==} @@ -4418,14 +4020,14 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@upstash/redis@1.34.9': - resolution: {integrity: sha512-7qzzF2FQP5VxR2YUNjemWs+hl/8VzJJ6fOkT7O7kt9Ct8olEVzb1g6/ik6B8Pb8W7ZmYv81SdlVV9F6O8bh/gw==} + '@upstash/redis@1.36.1': + resolution: {integrity: sha512-N6SjDcgXdOcTAF+7uNoY69o7hCspe9BcA7YjQdxVu5d25avljTwyLaHBW3krWjrP0FfocgMk94qyVtQbeDp39A==} '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + vite: ^6.4.1 '@vitest/coverage-v8@2.1.9': resolution: {integrity: sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==} @@ -4436,14 +4038,14 @@ packages: '@vitest/browser': optional: true - '@vitest/expect@4.0.15': - resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} + '@vitest/expect@4.0.17': + resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} - '@vitest/mocker@4.0.15': - resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} + '@vitest/mocker@4.0.17': + resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0-0 + vite: ^6.4.1 peerDependenciesMeta: msw: optional: true @@ -4453,17 +4055,17 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.0.15': - resolution: {integrity: sha512-SWdqR8vEv83WtZcrfLNqlqeQXlQLh2iilO1Wk1gv4eiHKjEzvgHb2OVc3mIPyhZE6F+CtfYjNlDJwP5MN6Km7A==} + '@vitest/pretty-format@4.0.17': + resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} - '@vitest/runner@4.0.15': - resolution: {integrity: sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==} + '@vitest/runner@4.0.17': + resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} - '@vitest/snapshot@4.0.15': - resolution: {integrity: sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==} + '@vitest/snapshot@4.0.17': + resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} - '@vitest/spy@4.0.15': - resolution: {integrity: sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==} + '@vitest/spy@4.0.17': + resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} '@vitest/ui@3.2.4': resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} @@ -4473,23 +4075,23 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.0.15': - resolution: {integrity: sha512-HXjPW2w5dxhTD0dLwtYHDnelK3j8sR8cWIaLxr22evTyY6q8pRCjZSmhRWVjBaOVXChQd6AwMzi9pucorXCPZA==} + '@vitest/utils@4.0.17': + resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} - '@volar/language-core@2.4.14': - resolution: {integrity: sha512-X6beusV0DvuVseaOEy7GoagS4rYHgDHnTrdOj5jeUb49fW5ceQyP9Ej5rBhqgz2wJggl+2fDbbojq1XKaxDi6w==} + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} - '@volar/source-map@2.4.14': - resolution: {integrity: sha512-5TeKKMh7Sfxo8021cJfmBzcjfY1SsXsPMMjMvjY7ivesdnybqqS+GxGAoXHAOUawQTwtdUxgP65Im+dEmvWtYQ==} + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} - '@volar/typescript@2.4.14': - resolution: {integrity: sha512-p8Z6f/bZM3/HyCdRNFZOEEzts51uV8WHeN8Tnfnm2EBv6FDB2TQLzfVx7aJvnl8ofKAOnS64B2O8bImBFaauRw==} + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} - '@vue/compiler-core@3.5.14': - resolution: {integrity: sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==} + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} - '@vue/compiler-dom@3.5.14': - resolution: {integrity: sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==} + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} @@ -4510,8 +4112,8 @@ packages: typescript: optional: true - '@vue/shared@3.5.14': - resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -4522,8 +4124,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -4547,15 +4149,15 @@ packages: ajv: optional: true - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alien-signals@0.4.14: resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} @@ -4563,12 +4165,8 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-escapes@7.0.0: - resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + ansi-escapes@7.2.0: + resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} engines: {node: '>=18'} ansi-regex@4.1.1: @@ -4579,8 +4177,8 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} ansi-styles@3.2.1: @@ -4595,12 +4193,12 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansis@4.1.0: - resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} any-promise@1.3.0: @@ -4624,9 +4222,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - asn1js@3.0.6: - resolution: {integrity: sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA==} - engines: {node: '>=12.0.0'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} ast-kit@2.2.0: resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} @@ -4647,8 +4245,8 @@ packages: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} - axios@1.9.0: - resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4659,15 +4257,76 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.9.14: + resolution: {integrity: sha512-B0xUquLkiGLgHhpPBqvl7GWegWBUNuujQ6kXd/r1U38ElPT6Ok8KZ8e+FpUGEc2ZoRQUzq/aUnaKFc/svWUGSg==} hasBin: true - better-auth@1.2.10: - resolution: {integrity: sha512-nEj1RG4DdLUuJiV5CR93ORyPCptGRBwksaPPCkUtGo9ka+UIlTpaiKoTaTqVLLYlqwX4bOj9tJ32oBNdf2G3Kg==} + better-auth@1.4.11: + resolution: {integrity: sha512-UvBokjRrLK+6mFvmZVhXEDe+ghqdR60DwfRvdth6R2cNnFn/VAGL6WcLVwEKBYjBplNMdslR62vOhUM+CSN0ww==} + peerDependencies: + '@lynx-js/react': '*' + '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 + '@sveltejs/kit': ^2.0.0 + '@tanstack/react-start': ^1.0.0 + better-sqlite3: ^12.0.0 + drizzle-kit: '>=0.31.4' + drizzle-orm: '>=0.41.0' + mongodb: ^6.0.0 || ^7.0.0 + mysql2: ^3.0.0 + next: ^14.0.0 || ^15.0.0 || ^16.0.0 + pg: ^8.0.0 + prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + solid-js: ^1.0.0 + svelte: ^4.0.0 || ^5.0.0 + vitest: ^2.0.0 || ^3.0.0 || ^4.0.0 + vue: ^3.0.0 + peerDependenciesMeta: + '@lynx-js/react': + optional: true + '@prisma/client': + optional: true + '@sveltejs/kit': + optional: true + '@tanstack/react-start': + optional: true + better-sqlite3: + optional: true + drizzle-kit: + optional: true + drizzle-orm: + optional: true + mongodb: + optional: true + mysql2: + optional: true + next: + optional: true + pg: + optional: true + prisma: + optional: true + react: + optional: true + react-dom: + optional: true + solid-js: + optional: true + svelte: + optional: true + vitest: + optional: true + vue: + optional: true - better-call@1.0.9: - resolution: {integrity: sha512-Qfm0gjk0XQz0oI7qvTK1hbqTsBY4xV2hsHAxF8LZfUYl3RaECCIifXuVqtPpZJWvlCCMlQSvkvhhyuApGUba6g==} + better-call@1.1.7: + resolution: {integrity: sha512-6gaJe1bBIEgVebQu/7q9saahVzvBsGaByEnE8aDVncZEDiJO7sdNB28ot9I6iXSbR25egGmmZ6aIURXyQHRraQ==} + peerDependencies: + zod: ^4.0.0 + peerDependenciesMeta: + zod: + optional: true better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -4692,22 +4351,22 @@ packages: bl@5.1.0: resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - body-parser@2.2.0: - resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4728,10 +4387,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c12@3.0.4: - resolution: {integrity: sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==} + c12@3.3.3: + resolution: {integrity: sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==} peerDependencies: - magicast: ^0.3.5 + magicast: '*' peerDependenciesMeta: magicast: optional: true @@ -4756,14 +4415,14 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - caniuse-lite@1.0.30001761: - resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} + caniuse-lite@1.0.30001764: + resolution: {integrity: sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.1: - resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk@4.1.2: @@ -4774,6 +4433,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4790,8 +4453,8 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} chokidar-cli@3.0.0: resolution: {integrity: sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==} @@ -4813,10 +4476,6 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -4926,10 +4585,6 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@14.0.0: - resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} - engines: {node: '>=20'} - commander@14.0.2: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} @@ -4965,9 +4620,9 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@1.0.0: - resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} - engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} @@ -4988,9 +4643,13 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - copy-anything@3.0.5: - resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} - engines: {node: '>=12.13'} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} cors@2.8.5: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} @@ -5009,9 +4668,6 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -5035,15 +4691,6 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5057,9 +4704,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decode-named-character-reference@1.1.0: - resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} - decode-named-character-reference@1.2.0: resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} @@ -5075,12 +4719,12 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} engines: {node: '>=18'} - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + default-browser@5.4.0: + resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} engines: {node: '>=18'} defaults@1.0.4: @@ -5116,18 +4760,14 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -5161,8 +4801,12 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dotenv@16.5.0: - resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} engines: {node: '>=12'} dreamopt@0.8.0: @@ -5272,8 +4916,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.177: - resolution: {integrity: sha512-7EH2G59nLsEMj97fpDuvVcYi6lwTcM1xuWw3PssD8xzboAW7zj7iB3COEEEATUfjLHrs5uKBLQT03V/8URx06g==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5301,10 +4945,6 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} - engines: {node: '>=10.13.0'} - enhanced-resolve@5.18.4: resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} @@ -5313,8 +4953,8 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} engines: {node: '>=0.12'} env-paths@3.0.0: @@ -5325,8 +4965,8 @@ packages: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} @@ -5347,8 +4987,8 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-toolkit@1.38.0: - resolution: {integrity: sha512-OT3AxczYYd3W50bCj4V0hKoOAfqIy9tof0leNQYekEDxVKir3RTVTJOLij7VAe6fsCNsGhC0JqIkURpMXTCSEA==} + es-toolkit@1.43.0: + resolution: {integrity: sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -5385,18 +5025,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.4: - resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.8: - resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.1: - resolution: {integrity: sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true @@ -5466,9 +5096,9 @@ packages: eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - eventsource-parser@3.0.3: - resolution: {integrity: sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA==} - engines: {node: '>=20.0.0'} + eventsource-parser@3.0.6: + resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + engines: {node: '>=18.0.0'} eventsource@3.0.7: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} @@ -5478,16 +5108,16 @@ packages: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - execa@9.5.3: - resolution: {integrity: sha512-QFNnTvU3UjgWFy8Ef9iDHvIdcgZ344ebkwYx4/KLbR+CKQA4xBaHzv+iRpp86QfMHP8faFQLh8iOc57215y4Rg==} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect-type@1.2.2: - resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} expect@29.7.0: @@ -5500,12 +5130,12 @@ packages: peerDependencies: express: '>= 4.11' - express@5.1.0: - resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} @@ -5516,10 +5146,6 @@ packages: extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -5527,34 +5153,18 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@5.3.2: - resolution: {integrity: sha512-n8v8b6p4Z1sMgqRmqLJm3awW4NX7NkaKPfb3uJIBTSH7Pdvufi3PQ3/lJLQrvxcMYl7JI2jnDO90siPEpD8JBA==} + fast-xml-parser@5.3.3: + resolution: {integrity: sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA==} hasBin: true - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - - fd-package-json@1.2.0: - resolution: {integrity: sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==} - - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} - fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true + fd-package-json@2.0.0: + resolution: {integrity: sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -5587,9 +5197,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - finalhandler@2.1.0: - resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} @@ -5602,8 +5212,8 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - fm-odata-client@3.0.1: - resolution: {integrity: sha512-L4ZB8LPDoNalR//GCFdxaZH5lLX7gRmCtgHmRtvvqOIib8Km8UGm3FxuFaQjDjkOzE/eM8ntkhEWrypjI6t6gg==} + fm-odata-client@3.0.2: + resolution: {integrity: sha512-iPEJFUWLTlBLFfL4UISsW7Xk4G5D2/8vPUoWxncWGuPScdENwpUaWczJzdi/rx8mIk6OHbVvbe3i9+pd6kPXJg==} engines: {node: '>=0.20'} peerDependencies: amazon-cognito-identity-js: ^4.5.12 @@ -5611,8 +5221,8 @@ packages: amazon-cognito-identity-js: optional: true - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -5624,12 +5234,12 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - formatly@0.2.3: - resolution: {integrity: sha512-WH01vbXEjh9L3bqn5V620xUAWs32CmK4IzWRRY6ep5zpa/mrisL4d9+pRVuETORVDTQw8OycSO1WC68PL51RaA==} + formatly@0.3.0: + resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} hasBin: true @@ -5648,8 +5258,8 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -5660,9 +5270,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -5721,7 +5328,7 @@ packages: fumadocs-core: ^15.0.0 || ^16.0.0 next: ^15.3.0 || ^16.0.0 react: '*' - vite: 6.x.x || 7.x.x + vite: ^6.4.1 peerDependenciesMeta: '@fumadocs/mdx-remote': optional: true @@ -5817,9 +5424,6 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.10.1: - resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} - get-tsconfig@4.13.0: resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} @@ -5840,28 +5444,11 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@11.0.2: - resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} + glob@11.1.0: + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} hasBin: true - glob@13.0.0: - resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} - engines: {node: 20 || >=22} - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -5880,8 +5467,8 @@ packages: resolution: {integrity: sha512-rEDCuqUQ4tbD78TpzsMtt5OIf0cBCSDWSJtUDaF6JsAh+k0v9r++NzxNEG87oDZx9ZwGhD8DaezR2L/yrw0Jdw==} engines: {node: '>=10'} - graphql@16.11.0: - resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} handlebars@4.7.8: @@ -5892,9 +5479,9 @@ packages: hanji@0.0.5: resolution: {integrity: sha512-Abxw1Lq+TnYiL4BueXqMau222fPSPMFtya8HdpWsz/xVAhifXou71mPh/kY2+08RgFcVccjG3uZHs6K5HAe3zw==} - happy-dom@15.11.7: - resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==} - engines: {node: '>=18.0.0'} + happy-dom@20.1.0: + resolution: {integrity: sha512-ebvqjBqzenBk2LjzNEAzoj7yhw7rW/R2/wVevMu6Mrq3MXtcI/RUz4+ozpcOcqVLEWPqLfg2v9EAU7fFXZUUJw==} + engines: {node: '>=20.0.0'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -5944,8 +5531,8 @@ packages: highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - hono@4.9.0: - resolution: {integrity: sha512-JAUc4Sqi3lhby2imRL/67LMcJFKiCu7ZKghM7iwvltVZzxEC5bVJCsAa4NTnSfmWGb+N2eOVtFE586R+K3fejA==} + hono@4.11.3: + resolution: {integrity: sha512-PmQi306+M/ct/m5s66Hrg+adPnkD5jiO6IjA7WhWw0gSBSo1EcRegwuI1deZ+wd5pzCGynCcn2DprnE4/yEV4w==} engines: {node: '>=16.9.0'} hookable@5.5.3: @@ -5957,16 +5544,16 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} https-proxy-agent@6.2.1: resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==} engines: {node: '>= 14'} - human-id@4.1.1: - resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + human-id@4.1.3: + resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true human-signals@4.3.1: @@ -5982,12 +5569,8 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -6013,18 +5596,14 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - inline-style-parser@0.2.4: - resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -6135,9 +5714,9 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-what@4.1.16: - resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} - engines: {node: '>=12.13'} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -6162,15 +5741,12 @@ packages: resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jackspeak@4.1.0: - resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} + jackspeak@4.1.1: + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} jest-diff@29.7.0: @@ -6197,10 +5773,6 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true - jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} - hasBin: true - jiti@2.6.1: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true @@ -6214,21 +5786,17 @@ packages: jose@5.10.0: resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} - jose@6.0.11: - resolution: {integrity: sha512-QxG7EaliDARm1O1S8BGakqncGT9s25bKL1WSf6/oa17Tkqwi8D2ZNglqCF+DsYF88/rV66Q/Q2mFAy697E1DUg==} + jose@6.1.3: + resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} - js-base64@3.7.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@3.14.2: + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true js-yaml@4.1.1: @@ -6247,12 +5815,12 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -6264,8 +5832,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -6275,20 +5843,20 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - knip@5.56.0: - resolution: {integrity: sha512-4RNCi41ax0zzl7jloxiUAcomwHIW+tj201jfr7TmHkSvb1/LkChsfXH0JOFFesVHhtSrMw6Dv4N6fmfFd4sJ0Q==} + knip@5.80.2: + resolution: {integrity: sha512-Yt7iF8Uzl7pp3mGA6yvum6PZBcbGhjasZYuqIwcIAX1jsIhGRUAK0icP0qrB6FSPBI3BpIeMHl7n9meCLO6ovg==} engines: {node: '>=18.18.0'} hasBin: true peerDependencies: '@types/node': '>=18' - typescript: '>=5.0.4' + typescript: '>=5.0.4 <7' kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - kysely@0.28.2: - resolution: {integrity: sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A==} - engines: {node: '>=18.0.0'} + kysely@0.28.9: + resolution: {integrity: sha512-3BeXMoiOhpOwu62CiVpO6lxfq4eS6KMYfQdMsN/2kUCRNuF2YiEr7u0HLHaQU+O4Xu8YXE3bHVkwaQ85i72EuA==} + engines: {node: '>=20.0.0'} libsql@0.3.19: resolution: {integrity: sha512-Aj5cQ5uk/6fHdmeW0TiXK42FqUlwx7ytmMLPSaUQPin5HKKKuUPD62MAbN4OEweGBBI7q1BekoEN4gPUEL6MZA==} @@ -6301,130 +5869,66 @@ packages: cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - lightningcss-darwin-arm64@1.30.2: resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - lightningcss-darwin-x64@1.30.2: resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - lightningcss-freebsd-x64@1.30.2: resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - lightningcss-linux-arm-gnueabihf@1.30.2: resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - lightningcss-linux-arm64-musl@1.30.2: resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - lightningcss-linux-x64-gnu@1.30.2: resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - lightningcss-linux-x64-musl@1.30.2: resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - lightningcss-win32-arm64-msvc@1.30.2: resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - lightningcss-win32-x64-msvc@1.30.2: resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} - engines: {node: '>= 12.0.0'} - lightningcss@1.30.2: resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} engines: {node: '>= 12.0.0'} @@ -6483,14 +5987,14 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} + loupe@3.2.1: + resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.1.0: - resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -6500,15 +6004,11 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - lru-queue@0.1.0: resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - lru.min@1.1.2: - resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==} + lru.min@1.1.3: + resolution: {integrity: sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} lucide-react@0.511.0: @@ -6521,9 +6021,6 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -6744,9 +6241,9 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -6764,10 +6261,6 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@10.0.3: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} @@ -6782,10 +6275,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} @@ -6801,10 +6290,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.2: - resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} - engines: {node: '>= 18'} - mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -6813,13 +6298,8 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mlly@1.8.0: + resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -6832,8 +6312,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msw@2.10.2: - resolution: {integrity: sha512-RCKM6IZseZQCWcSWlutdf590M8nVfRHG1ImwzOtwz8IYxgT4zhUO0rfTcTvDGiaFE0Rhcc+h43lcF3Jc9gFtwQ==} + msw@2.12.7: + resolution: {integrity: sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -6849,16 +6329,16 @@ packages: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} - mysql2@3.14.1: - resolution: {integrity: sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==} + mysql2@3.16.0: + resolution: {integrity: sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA==} engines: {node: '>= 8.0'} mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} + named-placeholders@1.1.6: + resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} + engines: {node: '>=8.0.0'} nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} @@ -6869,9 +6349,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanostores@0.11.4: - resolution: {integrity: sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ==} - engines: {node: ^18.0.0 || >=20.0.0} + nanostores@1.1.0: + resolution: {integrity: sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==} + engines: {node: ^20.0.0 || >=22.0.0} napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -6887,12 +6367,12 @@ packages: resolution: {integrity: sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==} engines: {node: '>=18'} - next-auth@4.24.11: - resolution: {integrity: sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==} + next-auth@4.24.13: + resolution: {integrity: sha512-sgObCfcfL7BzIK76SS5TnQtc3yo2Oifp/yIpfv6fMfeBOiBJkDWF3A2y9+yqnmJ4JKc2C+nMjSjmgDeTwgN1rQ==} peerDependencies: - '@auth/core': 0.34.2 - next: ^12.2.5 || ^13 || ^14 || ^15 - nodemailer: ^6.6.5 + '@auth/core': 0.34.3 + next: ^12.2.5 || ^13 || ^14 || ^15 || ^16 + nodemailer: ^7.0.7 react: ^17.0.2 || ^18 || ^19 react-dom: ^17.0.2 || ^18 || ^19 peerDependenciesMeta: @@ -6944,15 +6424,15 @@ packages: resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} engines: {node: '>=18'} - node-fetch-native@1.6.6: - resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==} + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} nodemon@3.1.11: resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} @@ -6975,11 +6455,6 @@ packages: resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - nypm@0.6.0: - resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} - engines: {node: ^14.16.0 || >=16.10.0} - hasBin: true - nypm@0.6.2: resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} @@ -6988,8 +6463,8 @@ packages: oauth4webapi@2.17.0: resolution: {integrity: sha512-lbC0Z7uzAFNFyzEYRIC+pkSVvDHJTbEW+dYlSBAlCYDe6RxUkJ26bClhk8ocBZip1wfI9uKTe0fm4Ib4RHn6uQ==} - oauth4webapi@3.5.1: - resolution: {integrity: sha512-txg/jZQwcbaF7PMJgY7aoxc9QuCxHVFMiEkDIJ60DwDz3PbtXPQnrzo+3X4IRYGChIwWLabRBRpf1k9hO9+xrQ==} + oauth4webapi@3.8.3: + resolution: {integrity: sha512-pQ5BsX3QRTgnt5HxgHwgunIRaDXBdkT23tf8dfzmtTIL2LTpdmxgbpbBm0VgFWAIDlezQvQCTgnVIUmHupXHxw==} oauth@0.9.15: resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==} @@ -7009,14 +6484,14 @@ packages: obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} - odata-query@8.0.4: - resolution: {integrity: sha512-v66MVxAZxlmOlFVaC9gvcDX5OcHO6yqc08AXhNhQ9LMbSzJKJ88uY1a7uDmLw2u4oMPGOMjnb8jdimA4kOD4Rw==} + odata-query@8.0.7: + resolution: {integrity: sha512-IB/iQjcK/B8omLGCXcWolP/Vkk+7gTC5maiTBbe02HhBKG8JCl5FWuKg1Sl6gim8LBsb3vVIrYG8vU7486gpcg==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - oidc-token-hash@5.1.0: - resolution: {integrity: sha512-y0W+X7Ppo7oZX6eovsRkuzcSM40Bicg2JEJkDJ4irIt1wsYAP5MLSNv+QAogO8xivMffw/9OvV3um1pxXgt1uA==} + oidc-token-hash@5.2.0: + resolution: {integrity: sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw==} engines: {node: ^10.13.0 || >=12.0.0} on-finished@2.4.1: @@ -7044,8 +6519,8 @@ packages: oniguruma-to-es@4.3.4: resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} - open@10.1.2: - resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} openid-client@5.7.1: @@ -7055,21 +6530,17 @@ packages: resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - outdent@0.5.0: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} - oxc-resolver@9.0.2: - resolution: {integrity: sha512-w838ygc1p7rF+7+h5vR9A+Y9Fc4imy6C3xPthCMkdFUgFvUWkmABeNB8RBDQ6+afk44Q60/UMMQ+gfDUW99fBA==} + oxc-resolver@11.16.2: + resolution: {integrity: sha512-Uy76u47vwhhF7VAmVY61Srn+ouiOobf45MU9vGct9GD2ARy6hKoqEElyHDB0L+4JOM6VLuZ431KiLwyjI/A21g==} - oxlint@1.37.0: - resolution: {integrity: sha512-MAw0JH8M5/vt9E2WxSsmJu53bVLmG6qNlVw1OXFenJYItTPbMBtW7j3n53+tgNhNuxFPundM1DR7V8E39qOOrg==} + oxlint@1.39.0: + resolution: {integrity: sha512-wSiLr0wjG+KTU6c1LpVoQk7JZ7l8HCKlAkVDVTJKWmCGazsNxexxnOXl7dsar92mQcRnzko5g077ggP3RINSjA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7161,21 +6632,13 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - path-to-regexp@8.2.0: - resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} - engines: {node: '>=16'} - path-to-regexp@8.3.0: resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} @@ -7190,8 +6653,8 @@ packages: resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} engines: {node: '>=14.16'} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -7200,10 +6663,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -7217,8 +6676,8 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkce-challenge@5.0.0: - resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} pkg-types@1.3.1: @@ -7239,33 +6698,27 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - postgres@3.4.5: - resolution: {integrity: sha512-cDWgoah1Gez9rN3H4165peY9qfpEo+SA61oQv65O3cRUE1pOEoJWwddwcqKE8XZYjbblOJlYDlLV4h67HrEVDg==} + postgres@3.4.8: + resolution: {integrity: sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==} engines: {node: '>=12'} preact-render-to-string@5.2.3: resolution: {integrity: sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==} peerDependencies: - preact: '>=10' + preact: ^10.26.10 preact-render-to-string@5.2.6: resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: - preact: '>=10' + preact: ^10.26.10 preact-render-to-string@6.5.11: resolution: {integrity: sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw==} peerDependencies: - preact: '>=10' - - preact@10.11.3: - resolution: {integrity: sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==} - - preact@10.24.3: - resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + preact: ^10.26.10 - preact@10.26.6: - resolution: {integrity: sha512-5SRRBinwpwkaD+OqlBDeITlRgvd8I8QlxHJw9AxSdMNV6O+LodN9nUyYGpSF7sadHjs6RzeFShMexC6DbtWr9g==} + preact@10.28.2: + resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==} prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} @@ -7289,8 +6742,8 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - pretty-ms@9.2.0: - resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} engines: {node: '>=18'} prisma@5.22.0: @@ -7312,9 +6765,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.15.0: - resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} @@ -7330,29 +6780,16 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - pvtsutils@1.3.6: - resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - - pvutils@1.1.3: - resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} - engines: {node: '>=6.0.0'} - - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} - quansync@0.2.10: - resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} - quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} quansync@1.0.0: resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -7380,9 +6817,9 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@3.0.0: - resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} - engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} @@ -7396,8 +6833,8 @@ packages: peerDependencies: react: ^19.2.3 - react-hook-form@7.68.0: - resolution: {integrity: sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==} + react-hook-form@7.71.0: + resolution: {integrity: sha512-oFDt/iIFMV9ZfV52waONXzg4xuSlbwKUPvXVH2jumL1me5qFhBMc4knZxuXiZ2+j6h546sYe3ZKJcg/900/iHw==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 @@ -7425,8 +6862,8 @@ packages: '@types/react': optional: true - react-remove-scroll@2.7.1: - resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} engines: {node: '>=10'} peerDependencies: '@types/react': '*' @@ -7476,8 +6913,10 @@ packages: recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} - recma-jsx@1.0.0: - resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==} + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 recma-parse@1.0.0: resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} @@ -7526,9 +6965,6 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -7543,8 +6979,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.10: - resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} engines: {node: '>= 0.4'} hasBin: true @@ -7556,6 +6992,9 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + rettime@0.7.0: + resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -7579,8 +7018,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.58: - resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} + rolldown@1.0.0-beta.59: + resolution: {integrity: sha512-Slm000Gd8/AO9z4Kxl4r8mp/iakrbAuJ1L+7ddpkNxgQ+Vf37WPvY63l3oeyZcfuPD1DRrUYBsRPIXSOhvOsmw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -7589,20 +7028,20 @@ packages: peerDependencies: rollup: 2.x || 3.x || 4.x - rollup@4.40.2: - resolution: {integrity: sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==} + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rou3@0.5.1: - resolution: {integrity: sha512-OXMmJ3zRk2xeXFGfA3K+EOPHC5u7RDFG7lIOx0X1pdnhUkI8MdVrbV+sNsD80ElpUZ+MRHdyxPnFthq9VHs8uQ==} + rou3@0.7.12: + resolution: {integrity: sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg==} router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} engines: {node: '>=18'} run-parallel@1.2.0: @@ -7636,32 +7075,27 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -7725,8 +7159,8 @@ packages: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} sisteransi@1.0.5: @@ -7744,8 +7178,8 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} - smol-toml@1.3.4: - resolution: {integrity: sha512-UOPtVuYkzYGee0Bd2Szz8d2G3RfMfJ2t3qVdZUAozZyAk+a0Sxa+QKix0YCwjL/A1RR0ar44nCxaoN9FxdJGwA==} + smol-toml@1.6.0: + resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} sonner@2.0.7: @@ -7772,9 +7206,9 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -7797,11 +7231,7 @@ packages: engines: {node: '>=10'} stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} @@ -7810,9 +7240,6 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} - stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7862,8 +7289,8 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + strip-ansi@7.1.2: + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} strip-bom@3.0.0: @@ -7886,22 +7313,22 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-json-comments@5.0.1: - resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} strtok3@9.1.1: resolution: {integrity: sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==} engines: {node: '>=16'} - style-to-js@1.1.17: - resolution: {integrity: sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - style-to-object@1.0.9: - resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -7916,8 +7343,8 @@ packages: babel-plugin-macros: optional: true - superjson@2.2.2: - resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} engines: {node: '>=16'} supports-color@5.5.0: @@ -7940,23 +7367,21 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} - tailwind-merge@3.3.1: - resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} tailwind-merge@3.4.0: resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} - tailwindcss@4.1.11: - resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} - tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} - tapable@2.2.2: - resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} tar-fs@2.1.4: @@ -7966,10 +7391,6 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -7998,24 +7419,10 @@ packages: tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyexec@1.0.2: resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} engines: {node: '>=18'} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} - - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -8035,9 +7442,12 @@ packages: resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} engines: {node: '>=14.0.0'} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -8047,8 +7457,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@6.0.0: - resolution: {integrity: sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} totalist@3.0.1: @@ -8059,9 +7469,9 @@ packages: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true - tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -8073,8 +7483,8 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - trpc-cli@0.12.1: - resolution: {integrity: sha512-/D/mIQf3tUrS7ZKJZ1gmSPJn2psAABJfkC5Eevm55SZ4s6KwANOUNlwhAGXN9HT4VSJVfoF2jettevE9vHPQlg==} + trpc-cli@0.12.2: + resolution: {integrity: sha512-kGNCiyOimGlfcZFImbWzFF2Nn3TMnenwUdyuckiN5SEaceJbIac7+Iau3WsVHjQpoNgugFruZMDOKf8GNQNtJw==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -8110,8 +7520,8 @@ packages: ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - tsconfck@3.1.5: - resolution: {integrity: sha512-CLDfGgUp7XPswWnezWwsCRxNmgQjhYq3VXHM0/XIRxhVrKw0M1if9agzryh1QS3nxjCROvV+xWxoJO1YctzzWg==} + tsconfck@3.1.6: + resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} hasBin: true peerDependencies: @@ -8149,11 +7559,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.20.3: - resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} - engines: {node: '>=18.0.0'} - hasBin: true - tsx@4.21.0: resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} engines: {node: '>=18.0.0'} @@ -8162,70 +7567,58 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.5.4: - resolution: {integrity: sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ==} + turbo-darwin-64@2.7.4: + resolution: {integrity: sha512-xDR30ltfkSsRfGzABBckvl1nz1cZ3ssTujvdj+TPwOweeDRvZ0e06t5DS0rmRBvyKpgGs42K/EK6Mn2qLlFY9A==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.5.4: - resolution: {integrity: sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A==} + turbo-darwin-arm64@2.7.4: + resolution: {integrity: sha512-P7sjqXtOL/+nYWPvcDGWhi8wf8M8mZHHB8XEzw2VX7VJrS8IGHyJHGD1AYfDvhAEcr7pnk3gGifz3/xyhI655w==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.5.4: - resolution: {integrity: sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA==} + turbo-linux-64@2.7.4: + resolution: {integrity: sha512-GofFOxRO/IhG8BcPyMSSB3Y2+oKQotsaYbHxL9yD6JPb20/o35eo+zUSyazOtilAwDHnak5dorAJFoFU8MIg2A==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.5.4: - resolution: {integrity: sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg==} + turbo-linux-arm64@2.7.4: + resolution: {integrity: sha512-+RQKgNjksVPxYAyAgmDV7w/1qj++qca+nSNTAOKGOfJiDtSvRKoci89oftJ6anGs00uamLKVEQ712TI/tfNAIw==} cpu: [arm64] os: [linux] - turbo-windows-64@2.5.4: - resolution: {integrity: sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA==} + turbo-windows-64@2.7.4: + resolution: {integrity: sha512-rfak1+g+ON3czs1mDYsCS4X74ZmK6gOgRQTXjDICtzvR4o61paqtgAYtNPofcVsMWeF4wvCajSeoAkkeAnQ1kg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.5.4: - resolution: {integrity: sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A==} + turbo-windows-arm64@2.7.4: + resolution: {integrity: sha512-1ZgBNjNRbDu/fPeqXuX9i26x3CJ/Y1gcwUpQ+Vp7kN9Un6RZ9kzs164f/knrjcu5E+szCRexVjRSJay1k5jApA==} cpu: [arm64] os: [win32] - turbo@2.5.4: - resolution: {integrity: sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA==} + turbo@2.7.4: + resolution: {integrity: sha512-bkO4AddmDishzJB2ze7aYYPaejMoJVfS0XnaR6RCdXFOY8JGJfQE+l9fKiV7uDPa5Ut44gmOWJL3894CIMeH9g==} hasBin: true - tw-animate-css@1.3.6: - resolution: {integrity: sha512-9dy0R9UsYEGmgf26L8UcHiLmSFTHa9+D7+dAt/G/sF5dCnPePZbfgDYinc7/UzAM7g/baVrmS6m9yEpU46d+LA==} - - twoslash-protocol@0.3.4: - resolution: {integrity: sha512-HHd7lzZNLUvjPzG/IE6js502gEzLC1x7HaO1up/f72d8G8ScWAs9Yfa97igelQRDl5h9tGcdFsRp+lNVre1EeQ==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} twoslash-protocol@0.3.6: resolution: {integrity: sha512-FHGsJ9Q+EsNr5bEbgG3hnbkvEBdW5STgPU824AHUjB4kw0Dn4p8tABT7Ncg1Ie6V0+mDg3Qpy41VafZXcQhWMA==} - twoslash@0.3.4: - resolution: {integrity: sha512-RtJURJlGRxrkJmTcZMjpr7jdYly1rfgpujJr1sBM9ch7SKVht/SjFk23IOAyvwT1NLCk+SJiMrvW4rIAUM2Wug==} - peerDependencies: - typescript: ^5.5.0 - twoslash@0.3.6: resolution: {integrity: sha512-VuI5OKl+MaUO9UIW3rXKoPgHI3X40ZgB/j12VY6h98Ae1mCBihjPvhOPeJWlxCYcmSbmeZt5ZKkK0dsVtp+6pA==} peerDependencies: typescript: ^5.5.0 - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} + type-fest@5.3.1: + resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} + engines: {node: '>=20'} type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} @@ -8254,16 +7647,16 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.2: + resolution: {integrity: sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uint8array-extras@1.4.0: - resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} ultracite@7.0.8: @@ -8285,6 +7678,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} @@ -8296,8 +7692,8 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} unist-util-position-from-estree@2.0.0: resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} @@ -8311,8 +7707,8 @@ packages: unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} @@ -8321,10 +7717,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -8333,8 +7725,11 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -8342,9 +7737,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -8400,7 +7792,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: typescript: '*' - vite: '*' + vite: ^6.4.1 peerDependenciesMeta: vite: optional: true @@ -8409,7 +7801,7 @@ packages: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: typescript: '*' - vite: '*' + vite: ^6.4.1 peerDependenciesMeta: vite: optional: true @@ -8417,18 +7809,18 @@ packages: vite-plugin-externalize-deps@0.9.0: resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==} peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + vite: ^6.4.1 vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: - vite: '*' + vite: ^6.4.1 peerDependenciesMeta: vite: optional: true - vite@6.3.5: - resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -8467,18 +7859,18 @@ packages: yaml: optional: true - vitest@4.0.15: - resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} + vitest@4.0.17: + resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.15 - '@vitest/browser-preview': 4.0.15 - '@vitest/browser-webdriverio': 4.0.15 - '@vitest/ui': 4.0.15 + '@vitest/browser-playwright': 4.0.17 + '@vitest/browser-preview': 4.0.17 + '@vitest/browser-webdriverio': 4.0.17 + '@vitest/ui': 4.0.17 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8504,8 +7896,9 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} @@ -8514,10 +7907,6 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - whatwg-mimetype@3.0.0: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} @@ -8561,8 +7950,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.2: - resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -8573,6 +7962,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -8586,10 +7979,6 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - yaml@2.8.2: resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} @@ -8617,31 +8006,22 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} - yoctocolors-cjs@2.1.2: - resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} - zod-to-json-schema@3.24.6: - resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} - peerDependencies: - zod: ^3.24.1 - - zod-validation-error@3.4.1: - resolution: {integrity: sha512-1KP64yqDPQ3rupxNv7oXhf7KdhHHgaqbKuspVoiN93TT0xrBjql+Svjkdjq/Qh/7GSMmgQs3AfvBT0heE35thw==} - engines: {node: '>=18.0.0'} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: - zod: ^3.24.4 + zod: ^3.25 || ^4 zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.2.0: - resolution: {integrity: sha512-Bd5fw9wlIhtqCCxotZgdTOMwGm1a0u75wARVEY9HMs1X17trvA/lMi4+MGK5EUfYkXVTbX8UDiDKW4OgzHVUZw==} - zod@4.3.5: resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} @@ -8654,8 +8034,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@andrewbranch/untar.js@1.0.3': {} @@ -8669,7 +8049,7 @@ snapshots: commander: 10.0.1 marked: 9.1.6 marked-terminal: 7.3.0(marked@9.1.6) - semver: 7.7.2 + semver: 7.7.3 '@arethetypeswrong/core@0.17.4': dependencies: @@ -8678,7 +8058,7 @@ snapshots: cjs-module-lexer: 1.4.3 fflate: 0.8.2 lru-cache: 10.4.3 - semver: 7.7.2 + semver: 7.7.3 typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 @@ -8689,20 +8069,20 @@ snapshots: cookie: 0.6.0 jose: 5.10.0 oauth4webapi: 2.17.0 - preact: 10.11.3 - preact-render-to-string: 5.2.3(preact@10.11.3) + preact: 10.28.2 + preact-render-to-string: 5.2.3(preact@10.28.2) - '@auth/core@0.39.1': + '@auth/core@0.41.1': dependencies: '@panva/hkdf': 1.2.1 - jose: 6.0.11 - oauth4webapi: 3.5.1 - preact: 10.24.3 - preact-render-to-string: 6.5.11(preact@10.24.3) + jose: 6.1.3 + oauth4webapi: 3.8.3 + preact: 10.28.2 + preact-render-to-string: 6.5.11(preact@10.28.2) - '@auth/drizzle-adapter@1.9.1': + '@auth/drizzle-adapter@1.11.1': dependencies: - '@auth/core': 0.39.1 + '@auth/core': 0.41.1 transitivePeerDependencies: - '@simplewebauthn/browser' - '@simplewebauthn/server' @@ -8719,31 +8099,11 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.27.7': {} - - '@babel/core@7.27.7': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.27.7) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/traverse': 7.27.7 - '@babel/types': 7.28.2 - convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/compat-data@7.28.5': {} '@babel/core@7.28.5': dependencies: @@ -8758,98 +8118,59 @@ snapshots: '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 - jsesc: 3.1.0 - '@babel/generator@7.28.5': dependencies: '@babel/parser': 7.28.5 '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.27.7 + '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.27.7)': - dependencies: - '@babel/core': 7.27.7 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.7 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-class-features-plugin@7.27.1(@babel/core@7.28.5)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@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/core@7.28.5) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.5 semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.27.1': + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.5 '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.28.2 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.27.7)': - dependencies: - '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -8857,7 +8178,7 @@ snapshots: dependencies: '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -8868,53 +8189,33 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.7)': - dependencies: - '@babel/core': 7.27.7 - '@babel/helper-member-expression-to-functions': 7.27.1 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.27.7 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.27.7 - '@babel/types': 7.28.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.27.6': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 '@babel/types': 7.28.5 - '@babel/parser@7.28.3': - dependencies: - '@babel/types': 7.28.2 - '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 @@ -8924,11 +8225,6 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.7)': - dependencies: - '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -8937,12 +8233,12 @@ snapshots: '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.5) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-display-name@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 @@ -8971,7 +8267,7 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) - '@babel/types': 7.27.7 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color @@ -8981,72 +8277,47 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.27.7)': - dependencies: - '@babel/core': 7.27.7 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.27.1(@babel/core@7.28.5) + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@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(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/preset-react@7.27.1(@babel/core@7.28.5)': + '@babel/preset-react@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-transform-react-display-name': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.27.1(@babel/core@7.28.5)': + '@babel/preset-typescript@7.28.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/runtime@7.27.1': {} - '@babel/runtime@7.28.4': {} '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.5 - '@babel/types': 7.27.7 - - '@babel/traverse@7.27.7': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/parser': 7.28.3 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.1(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + '@babel/types': 7.28.5 '@babel/traverse@7.28.5': dependencies: @@ -9056,20 +8327,10 @@ snapshots: '@babel/parser': 7.28.5 '@babel/template': 7.27.2 '@babel/types': 7.28.5 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/types@7.27.7': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@babel/types@7.28.2': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9084,7 +8345,7 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) reselect: 5.1.1 - tabbable: 6.3.0 + tabbable: 6.4.0 use-sync-external-store: 1.6.0(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 @@ -9102,14 +8363,28 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@better-auth/utils@0.2.5': + '@better-auth/core@1.4.11(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)': dependencies: - typescript: 5.9.3 - uncrypto: 0.1.3 + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.21 + '@standard-schema/spec': 1.1.0 + better-call: 1.1.7(zod@4.3.5) + jose: 6.1.3 + kysely: 0.28.9 + nanostores: 1.1.0 + zod: 4.3.5 + + '@better-auth/telemetry@1.4.11(@better-auth/core@1.4.11(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0))': + dependencies: + '@better-auth/core': 1.4.11(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.21 + + '@better-auth/utils@0.3.0': {} '@better-fetch/fetch@1.1.17': {} - '@better-fetch/fetch@1.1.18': {} + '@better-fetch/fetch@1.1.21': {} '@biomejs/biome@2.3.11': optionalDependencies: @@ -9146,24 +8421,13 @@ snapshots: '@biomejs/cli-win32-x64@2.3.11': optional: true - '@braidai/lang@1.1.1': {} - - '@bundled-es-modules/cookie@2.0.1': - dependencies: - cookie: 0.7.2 - - '@bundled-es-modules/statuses@1.0.1': - dependencies: - statuses: 2.0.2 + '@borewit/text-codec@0.2.1': {} - '@bundled-es-modules/tough-cookie@0.1.6': - dependencies: - '@types/tough-cookie': 4.0.5 - tough-cookie: 4.1.4 + '@braidai/lang@1.1.2': {} - '@changesets/apply-release-plan@7.0.12': + '@changesets/apply-release-plan@7.0.14': dependencies: - '@changesets/config': 3.1.1 + '@changesets/config': 3.1.2 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 @@ -9175,53 +8439,55 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 - '@changesets/assemble-release-plan@6.0.8': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.7.2 + semver: 7.7.3 '@changesets/changelog-git@0.2.1': dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.4': + '@changesets/cli@2.29.8(@types/node@22.19.5)': dependencies: - '@changesets/apply-release-plan': 7.0.12 - '@changesets/assemble-release-plan': 6.0.8 + '@changesets/apply-release-plan': 7.0.14 + '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.1 + '@changesets/config': 3.1.2 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.12 + '@changesets/get-release-plan': 4.0.14 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 + '@changesets/read': 0.6.6 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 + '@inquirer/external-editor': 1.0.3(@types/node@22.19.5) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 - external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.7.2 + semver: 7.7.3 spawndamnit: 3.0.1 term-size: 2.2.1 + transitivePeerDependencies: + - '@types/node' - '@changesets/config@3.1.1': + '@changesets/config@3.1.2': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 @@ -9240,14 +8506,14 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.7.2 + semver: 7.7.3 - '@changesets/get-release-plan@4.0.12': + '@changesets/get-release-plan@4.0.14': dependencies: - '@changesets/assemble-release-plan': 6.0.8 - '@changesets/config': 3.1.1 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.2 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.5 + '@changesets/read': 0.6.6 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -9265,10 +8531,10 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.1': + '@changesets/parse@0.4.2': dependencies: '@changesets/types': 6.1.0 - js-yaml: 3.14.1 + js-yaml: 4.1.1 '@changesets/pre@2.0.2': dependencies: @@ -9277,11 +8543,11 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.5': + '@changesets/read@0.6.6': dependencies: '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.1 + '@changesets/parse': 0.4.2 '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 @@ -9300,7 +8566,7 @@ snapshots: dependencies: '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 4.1.1 + human-id: 4.1.3 prettier: 2.8.8 '@clack/core@0.3.5': @@ -9322,9 +8588,9 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commander-js/extra-typings@14.0.0(commander@14.0.0)': + '@commander-js/extra-typings@14.0.0(commander@14.0.2)': dependencies: - commander: 14.0.0 + commander: 14.0.2 '@dnd-kit/accessibility@3.1.1(react@19.2.3)': dependencies: @@ -9358,23 +8624,12 @@ snapshots: react: 19.2.3 tslib: 2.8.1 - '@emnapi/core@1.7.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 @@ -9398,13 +8653,7 @@ snapshots: '@esbuild/aix-ppc64@0.19.12': optional: true - '@esbuild/aix-ppc64@0.25.4': - optional: true - - '@esbuild/aix-ppc64@0.25.8': - optional: true - - '@esbuild/aix-ppc64@0.27.1': + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/aix-ppc64@0.27.2': @@ -9416,13 +8665,7 @@ snapshots: '@esbuild/android-arm64@0.19.12': optional: true - '@esbuild/android-arm64@0.25.4': - optional: true - - '@esbuild/android-arm64@0.25.8': - optional: true - - '@esbuild/android-arm64@0.27.1': + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm64@0.27.2': @@ -9434,13 +8677,7 @@ snapshots: '@esbuild/android-arm@0.19.12': optional: true - '@esbuild/android-arm@0.25.4': - optional: true - - '@esbuild/android-arm@0.25.8': - optional: true - - '@esbuild/android-arm@0.27.1': + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-arm@0.27.2': @@ -9452,13 +8689,7 @@ snapshots: '@esbuild/android-x64@0.19.12': optional: true - '@esbuild/android-x64@0.25.4': - optional: true - - '@esbuild/android-x64@0.25.8': - optional: true - - '@esbuild/android-x64@0.27.1': + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/android-x64@0.27.2': @@ -9470,13 +8701,7 @@ snapshots: '@esbuild/darwin-arm64@0.19.12': optional: true - '@esbuild/darwin-arm64@0.25.4': - optional: true - - '@esbuild/darwin-arm64@0.25.8': - optional: true - - '@esbuild/darwin-arm64@0.27.1': + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-arm64@0.27.2': @@ -9488,13 +8713,7 @@ snapshots: '@esbuild/darwin-x64@0.19.12': optional: true - '@esbuild/darwin-x64@0.25.4': - optional: true - - '@esbuild/darwin-x64@0.25.8': - optional: true - - '@esbuild/darwin-x64@0.27.1': + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/darwin-x64@0.27.2': @@ -9506,13 +8725,7 @@ snapshots: '@esbuild/freebsd-arm64@0.19.12': optional: true - '@esbuild/freebsd-arm64@0.25.4': - optional: true - - '@esbuild/freebsd-arm64@0.25.8': - optional: true - - '@esbuild/freebsd-arm64@0.27.1': + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.27.2': @@ -9524,13 +8737,7 @@ snapshots: '@esbuild/freebsd-x64@0.19.12': optional: true - '@esbuild/freebsd-x64@0.25.4': - optional: true - - '@esbuild/freebsd-x64@0.25.8': - optional: true - - '@esbuild/freebsd-x64@0.27.1': + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/freebsd-x64@0.27.2': @@ -9542,13 +8749,7 @@ snapshots: '@esbuild/linux-arm64@0.19.12': optional: true - '@esbuild/linux-arm64@0.25.4': - optional: true - - '@esbuild/linux-arm64@0.25.8': - optional: true - - '@esbuild/linux-arm64@0.27.1': + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm64@0.27.2': @@ -9560,13 +8761,7 @@ snapshots: '@esbuild/linux-arm@0.19.12': optional: true - '@esbuild/linux-arm@0.25.4': - optional: true - - '@esbuild/linux-arm@0.25.8': - optional: true - - '@esbuild/linux-arm@0.27.1': + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-arm@0.27.2': @@ -9578,13 +8773,7 @@ snapshots: '@esbuild/linux-ia32@0.19.12': optional: true - '@esbuild/linux-ia32@0.25.4': - optional: true - - '@esbuild/linux-ia32@0.25.8': - optional: true - - '@esbuild/linux-ia32@0.27.1': + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-ia32@0.27.2': @@ -9596,13 +8785,7 @@ snapshots: '@esbuild/linux-loong64@0.19.12': optional: true - '@esbuild/linux-loong64@0.25.4': - optional: true - - '@esbuild/linux-loong64@0.25.8': - optional: true - - '@esbuild/linux-loong64@0.27.1': + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-loong64@0.27.2': @@ -9614,13 +8797,7 @@ snapshots: '@esbuild/linux-mips64el@0.19.12': optional: true - '@esbuild/linux-mips64el@0.25.4': - optional: true - - '@esbuild/linux-mips64el@0.25.8': - optional: true - - '@esbuild/linux-mips64el@0.27.1': + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-mips64el@0.27.2': @@ -9632,13 +8809,7 @@ snapshots: '@esbuild/linux-ppc64@0.19.12': optional: true - '@esbuild/linux-ppc64@0.25.4': - optional: true - - '@esbuild/linux-ppc64@0.25.8': - optional: true - - '@esbuild/linux-ppc64@0.27.1': + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-ppc64@0.27.2': @@ -9650,13 +8821,7 @@ snapshots: '@esbuild/linux-riscv64@0.19.12': optional: true - '@esbuild/linux-riscv64@0.25.4': - optional: true - - '@esbuild/linux-riscv64@0.25.8': - optional: true - - '@esbuild/linux-riscv64@0.27.1': + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-riscv64@0.27.2': @@ -9668,13 +8833,7 @@ snapshots: '@esbuild/linux-s390x@0.19.12': optional: true - '@esbuild/linux-s390x@0.25.4': - optional: true - - '@esbuild/linux-s390x@0.25.8': - optional: true - - '@esbuild/linux-s390x@0.27.1': + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-s390x@0.27.2': @@ -9686,25 +8845,13 @@ snapshots: '@esbuild/linux-x64@0.19.12': optional: true - '@esbuild/linux-x64@0.25.4': - optional: true - - '@esbuild/linux-x64@0.25.8': - optional: true - - '@esbuild/linux-x64@0.27.1': + '@esbuild/linux-x64@0.25.12': optional: true '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.4': - optional: true - - '@esbuild/netbsd-arm64@0.25.8': - optional: true - - '@esbuild/netbsd-arm64@0.27.1': + '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.27.2': @@ -9716,25 +8863,13 @@ snapshots: '@esbuild/netbsd-x64@0.19.12': optional: true - '@esbuild/netbsd-x64@0.25.4': - optional: true - - '@esbuild/netbsd-x64@0.25.8': - optional: true - - '@esbuild/netbsd-x64@0.27.1': + '@esbuild/netbsd-x64@0.25.12': optional: true '@esbuild/netbsd-x64@0.27.2': optional: true - '@esbuild/openbsd-arm64@0.25.4': - optional: true - - '@esbuild/openbsd-arm64@0.25.8': - optional: true - - '@esbuild/openbsd-arm64@0.27.1': + '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.27.2': @@ -9746,22 +8881,13 @@ snapshots: '@esbuild/openbsd-x64@0.19.12': optional: true - '@esbuild/openbsd-x64@0.25.4': - optional: true - - '@esbuild/openbsd-x64@0.25.8': - optional: true - - '@esbuild/openbsd-x64@0.27.1': + '@esbuild/openbsd-x64@0.25.12': optional: true '@esbuild/openbsd-x64@0.27.2': optional: true - '@esbuild/openharmony-arm64@0.25.8': - optional: true - - '@esbuild/openharmony-arm64@0.27.1': + '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.27.2': @@ -9773,31 +8899,19 @@ snapshots: '@esbuild/sunos-x64@0.19.12': optional: true - '@esbuild/sunos-x64@0.25.4': - optional: true - - '@esbuild/sunos-x64@0.25.8': - optional: true - - '@esbuild/sunos-x64@0.27.1': - optional: true - - '@esbuild/sunos-x64@0.27.2': - optional: true - - '@esbuild/win32-arm64@0.18.20': + '@esbuild/sunos-x64@0.25.12': optional: true - '@esbuild/win32-arm64@0.19.12': + '@esbuild/sunos-x64@0.27.2': optional: true - '@esbuild/win32-arm64@0.25.4': + '@esbuild/win32-arm64@0.18.20': optional: true - '@esbuild/win32-arm64@0.25.8': + '@esbuild/win32-arm64@0.19.12': optional: true - '@esbuild/win32-arm64@0.27.1': + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-arm64@0.27.2': @@ -9809,13 +8923,7 @@ snapshots: '@esbuild/win32-ia32@0.19.12': optional: true - '@esbuild/win32-ia32@0.25.4': - optional: true - - '@esbuild/win32-ia32@0.25.8': - optional: true - - '@esbuild/win32-ia32@0.27.1': + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-ia32@0.27.2': @@ -9827,13 +8935,7 @@ snapshots: '@esbuild/win32-x64@0.19.12': optional: true - '@esbuild/win32-x64@0.25.4': - optional: true - - '@esbuild/win32-x64@0.25.8': - optional: true - - '@esbuild/win32-x64@0.27.1': + '@esbuild/win32-x64@0.25.12': optional: true '@esbuild/win32-x64@0.27.2': @@ -9841,30 +8943,15 @@ snapshots: '@fetchkit/ffetch@4.2.0': {} - '@floating-ui/core@1.7.1': - dependencies: - '@floating-ui/utils': 0.2.9 - '@floating-ui/core@1.7.3': dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.1': - dependencies: - '@floating-ui/core': 1.7.1 - '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.7.4': dependencies: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@floating-ui/dom': 1.7.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@floating-ui/dom': 1.7.4 @@ -9873,8 +8960,6 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@floating-ui/utils@0.2.9': {} - '@formatjs/fast-memoize@3.0.3': dependencies: tslib: 2.8.1 @@ -9884,9 +8969,9 @@ snapshots: '@formatjs/fast-memoize': 3.0.3 tslib: 2.8.1 - '@fumadocs/ui@16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5)': + '@fumadocs/ui@16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5)': dependencies: - fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) + fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) postcss-selector-parser: 7.1.1 react: 19.2.3 @@ -9894,8 +8979,8 @@ snapshots: tailwind-merge: 3.4.0 optionalDependencies: '@types/react': 19.2.7 - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - tailwindcss: 4.1.11 + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + tailwindcss: 4.1.18 transitivePeerDependencies: - '@mixedbread/sdk' - '@orama/core' @@ -9908,29 +8993,27 @@ snapshots: - waku - zod - '@headless-tree/core@1.6.0': {} + '@headless-tree/core@1.6.2': {} - '@headless-tree/react@1.6.0(@headless-tree/core@1.6.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@headless-tree/react@1.6.2(@headless-tree/core@1.6.2)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@headless-tree/core': 1.6.0 + '@headless-tree/core': 1.6.2 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@hexagon/base64@1.1.28': {} - - '@hono/node-server@1.19.7(hono@4.9.0)': + '@hono/node-server@1.19.8(hono@4.11.3)': dependencies: - hono: 4.9.0 + hono: 4.11.3 - '@hono/zod-validator@0.7.5(hono@4.9.0)(zod@4.3.5)': + '@hono/zod-validator@0.7.6(hono@4.11.3)(zod@4.3.5)': dependencies: - hono: 4.9.0 + hono: 4.11.3 zod: 4.3.5 - '@hookform/resolvers@5.2.2(react-hook-form@7.68.0(react@19.2.3))': + '@hookform/resolvers@5.2.2(react-hook-form@7.71.0(react@19.2.3))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.68.0(react@19.2.3) + react-hook-form: 7.71.0(react@19.2.3) '@img/colour@1.0.0': optional: true @@ -10029,55 +9112,67 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/confirm@5.1.12(@types/node@22.17.1)': + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21(@types/node@22.19.5)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.17.1) - '@inquirer/type': 3.0.7(@types/node@22.17.1) + '@inquirer/core': 10.3.2(@types/node@22.19.5) + '@inquirer/type': 3.0.10(@types/node@22.19.5) optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@inquirer/confirm@5.1.12(@types/node@22.19.3)': + '@inquirer/confirm@5.1.21(@types/node@25.0.6)': dependencies: - '@inquirer/core': 10.1.13(@types/node@22.19.3) - '@inquirer/type': 3.0.7(@types/node@22.19.3) + '@inquirer/core': 10.3.2(@types/node@25.0.6) + '@inquirer/type': 3.0.10(@types/node@25.0.6) optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 + optional: true - '@inquirer/core@10.1.13(@types/node@22.17.1)': + '@inquirer/core@10.3.2(@types/node@22.19.5)': dependencies: - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.17.1) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.5) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@inquirer/core@10.1.13(@types/node@22.19.3)': + '@inquirer/core@10.3.2(@types/node@25.0.6)': dependencies: - '@inquirer/figures': 1.0.12 - '@inquirer/type': 3.0.7(@types/node@22.19.3) - ansi-escapes: 4.3.2 + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@25.0.6) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 - yoctocolors-cjs: 2.1.2 + yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 + optional: true + + '@inquirer/external-editor@1.0.3(@types/node@22.19.5)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 22.19.5 - '@inquirer/figures@1.0.12': {} + '@inquirer/figures@1.0.15': {} - '@inquirer/type@3.0.7(@types/node@22.17.1)': + '@inquirer/type@3.0.10(@types/node@22.19.5)': optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@inquirer/type@3.0.7(@types/node@22.19.3)': + '@inquirer/type@3.0.10(@types/node@25.0.6)': optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 + optional: true '@isaacs/balanced-match@4.0.1': {} @@ -10089,15 +9184,11 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - '@istanbuljs/schema@0.1.3': {} '@jest/expect-utils@29.7.0': @@ -10113,51 +9204,34 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.17.1 - '@types/yargs': 17.0.33 + '@types/node': 22.19.5 + '@types/yargs': 17.0.35 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.30 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@jridgewell/trace-mapping@0.3.30': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@levischuck/tiny-cbor@0.2.11': {} - '@libsql/client@0.6.2': dependencies: '@libsql/core': 0.6.2 '@libsql/hrana-client': 0.6.2 - js-base64: 3.7.7 + js-base64: 3.7.8 libsql: 0.3.19 transitivePeerDependencies: - bufferutil @@ -10165,7 +9239,7 @@ snapshots: '@libsql/core@0.6.2': dependencies: - js-base64: 3.7.7 + js-base64: 3.7.8 '@libsql/darwin-arm64@0.3.19': optional: true @@ -10177,7 +9251,7 @@ snapshots: dependencies: '@libsql/isomorphic-fetch': 0.2.5 '@libsql/isomorphic-ws': 0.1.5 - js-base64: 3.7.7 + js-base64: 3.7.8 node-fetch: 3.3.2 transitivePeerDependencies: - bufferutil @@ -10188,7 +9262,7 @@ snapshots: '@libsql/isomorphic-ws@0.1.5': dependencies: '@types/ws': 8.18.1 - ws: 8.18.2 + ws: 8.19.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10210,18 +9284,18 @@ snapshots: '@loaderkit/resolve@1.0.4': dependencies: - '@braidai/lang': 1.1.1 + '@braidai/lang': 1.1.2 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.4 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.4 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -10234,7 +9308,7 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.4 '@types/mdx': 2.0.13 - acorn: 8.14.1 + acorn: 8.15.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -10243,13 +9317,13 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.0(acorn@8.14.1) + recma-jsx: 1.0.1(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-rehype: 11.1.2 - source-map: 0.7.4 + source-map: 0.7.6 unified: 11.0.5 unist-util-position-from-estree: 2.0.0 unist-util-stringify-position: 4.0.0 @@ -10258,79 +9332,79 @@ snapshots: transitivePeerDependencies: - supports-color - '@microsoft/api-extractor-model@7.29.6(@types/node@22.17.1)': + '@microsoft/api-extractor-model@7.29.6(@types/node@22.19.5)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.17.1) + '@rushstack/node-core-library': 5.7.0(@types/node@22.19.5) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.29.6(@types/node@22.19.3)': + '@microsoft/api-extractor-model@7.29.6(@types/node@25.0.6)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.19.3) + '@rushstack/node-core-library': 5.7.0(@types/node@25.0.6) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.32.1(@types/node@22.17.1)': + '@microsoft/api-extractor-model@7.32.2(@types/node@22.19.5)': dependencies: '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.0(@types/node@22.17.1) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.5) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@22.17.1)': + '@microsoft/api-extractor@7.47.7(@types/node@22.19.5)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.17.1) + '@microsoft/api-extractor-model': 7.29.6(@types/node@22.19.5) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.17.1) + '@rushstack/node-core-library': 5.7.0(@types/node@22.19.5) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.17.1) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.17.1) + '@rushstack/terminal': 0.14.0(@types/node@22.19.5) + '@rushstack/ts-command-line': 4.22.6(@types/node@22.19.5) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.7(@types/node@22.19.3)': + '@microsoft/api-extractor@7.47.7(@types/node@25.0.6)': dependencies: - '@microsoft/api-extractor-model': 7.29.6(@types/node@22.19.3) + '@microsoft/api-extractor-model': 7.29.6(@types/node@25.0.6) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.7.0(@types/node@22.19.3) + '@rushstack/node-core-library': 5.7.0(@types/node@25.0.6) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.0(@types/node@22.19.3) - '@rushstack/ts-command-line': 4.22.6(@types/node@22.19.3) + '@rushstack/terminal': 0.14.0(@types/node@25.0.6) + '@rushstack/ts-command-line': 4.22.6(@types/node@25.0.6) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.55.1(@types/node@22.17.1)': + '@microsoft/api-extractor@7.55.2(@types/node@22.19.5)': dependencies: - '@microsoft/api-extractor-model': 7.32.1(@types/node@22.17.1) + '@microsoft/api-extractor-model': 7.32.2(@types/node@22.19.5) '@microsoft/tsdoc': 0.16.0 '@microsoft/tsdoc-config': 0.18.0 - '@rushstack/node-core-library': 5.19.0(@types/node@22.17.1) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.5) '@rushstack/rig-package': 0.6.0 - '@rushstack/terminal': 0.19.4(@types/node@22.17.1) - '@rushstack/ts-command-line': 5.1.4(@types/node@22.17.1) + '@rushstack/terminal': 0.19.5(@types/node@22.19.5) + '@rushstack/ts-command-line': 5.1.5(@types/node@22.19.5) diff: 8.0.2 lodash: 4.17.21 minimatch: 10.0.3 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -10342,37 +9416,42 @@ snapshots: '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 '@microsoft/tsdoc-config@0.18.0': dependencies: '@microsoft/tsdoc': 0.16.0 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 '@microsoft/tsdoc@0.15.1': {} '@microsoft/tsdoc@0.16.0': {} - '@modelcontextprotocol/sdk@1.17.2': + '@modelcontextprotocol/sdk@1.25.2(hono@4.11.3)(zod@3.25.76)': dependencies: - ajv: 6.12.6 + '@hono/node-server': 1.19.8(hono@4.11.3) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 cors: 2.8.5 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.3 - express: 5.1.0 - express-rate-limit: 7.5.1(express@5.1.0) - pkce-challenge: 5.0.0 - raw-body: 3.0.0 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: + - hono - supports-color - '@mswjs/interceptors@0.39.2': + '@mswjs/interceptors@0.40.0': dependencies: '@open-draft/deferred-promise': 2.2.0 '@open-draft/logger': 0.3.0 @@ -10381,13 +9460,6 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 - '@tybys/wasm-util': 0.10.1 - optional: true - '@napi-rs/wasm-runtime@1.1.1': dependencies: '@emnapi/core': 1.8.1 @@ -10423,9 +9495,9 @@ snapshots: '@next/swc-win32-x64-msvc@16.1.1': optional: true - '@noble/ciphers@0.6.0': {} + '@noble/ciphers@2.1.1': {} - '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.1': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -10437,7 +9509,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 '@open-draft/deferred-promise@2.2.0': {} @@ -10450,111 +9522,96 @@ snapshots: '@orama/orama@3.1.18': {} - '@oxc-project/types@0.106.0': {} + '@oxc-project/types@0.107.0': {} - '@oxc-resolver/binding-darwin-arm64@9.0.2': + '@oxc-resolver/binding-android-arm-eabi@11.16.2': optional: true - '@oxc-resolver/binding-darwin-x64@9.0.2': + '@oxc-resolver/binding-android-arm64@11.16.2': optional: true - '@oxc-resolver/binding-freebsd-x64@9.0.2': + '@oxc-resolver/binding-darwin-arm64@11.16.2': optional: true - '@oxc-resolver/binding-linux-arm-gnueabihf@9.0.2': + '@oxc-resolver/binding-darwin-x64@11.16.2': optional: true - '@oxc-resolver/binding-linux-arm64-gnu@9.0.2': + '@oxc-resolver/binding-freebsd-x64@11.16.2': optional: true - '@oxc-resolver/binding-linux-arm64-musl@9.0.2': + '@oxc-resolver/binding-linux-arm-gnueabihf@11.16.2': optional: true - '@oxc-resolver/binding-linux-riscv64-gnu@9.0.2': + '@oxc-resolver/binding-linux-arm-musleabihf@11.16.2': optional: true - '@oxc-resolver/binding-linux-s390x-gnu@9.0.2': + '@oxc-resolver/binding-linux-arm64-gnu@11.16.2': optional: true - '@oxc-resolver/binding-linux-x64-gnu@9.0.2': + '@oxc-resolver/binding-linux-arm64-musl@11.16.2': optional: true - '@oxc-resolver/binding-linux-x64-musl@9.0.2': + '@oxc-resolver/binding-linux-ppc64-gnu@11.16.2': optional: true - '@oxc-resolver/binding-wasm32-wasi@9.0.2': - dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@oxc-resolver/binding-linux-riscv64-gnu@11.16.2': optional: true - '@oxc-resolver/binding-win32-arm64-msvc@9.0.2': + '@oxc-resolver/binding-linux-riscv64-musl@11.16.2': optional: true - '@oxc-resolver/binding-win32-x64-msvc@9.0.2': + '@oxc-resolver/binding-linux-s390x-gnu@11.16.2': optional: true - '@oxlint/darwin-arm64@1.37.0': + '@oxc-resolver/binding-linux-x64-gnu@11.16.2': optional: true - '@oxlint/darwin-x64@1.37.0': + '@oxc-resolver/binding-linux-x64-musl@11.16.2': optional: true - '@oxlint/linux-arm64-gnu@1.37.0': + '@oxc-resolver/binding-openharmony-arm64@11.16.2': optional: true - '@oxlint/linux-arm64-musl@1.37.0': + '@oxc-resolver/binding-wasm32-wasi@11.16.2': + dependencies: + '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxlint/linux-x64-gnu@1.37.0': + '@oxc-resolver/binding-win32-arm64-msvc@11.16.2': optional: true - '@oxlint/linux-x64-musl@1.37.0': + '@oxc-resolver/binding-win32-ia32-msvc@11.16.2': optional: true - '@oxlint/win32-arm64@1.37.0': + '@oxc-resolver/binding-win32-x64-msvc@11.16.2': optional: true - '@oxlint/win32-x64@1.37.0': + '@oxlint/darwin-arm64@1.39.0': optional: true - '@panva/hkdf@1.2.1': {} + '@oxlint/darwin-x64@1.39.0': + optional: true - '@peculiar/asn1-android@2.3.16': - dependencies: - '@peculiar/asn1-schema': 2.3.15 - asn1js: 3.0.6 - tslib: 2.8.1 + '@oxlint/linux-arm64-gnu@1.39.0': + optional: true - '@peculiar/asn1-ecc@2.3.15': - dependencies: - '@peculiar/asn1-schema': 2.3.15 - '@peculiar/asn1-x509': 2.3.15 - asn1js: 3.0.6 - tslib: 2.8.1 + '@oxlint/linux-arm64-musl@1.39.0': + optional: true - '@peculiar/asn1-rsa@2.3.15': - dependencies: - '@peculiar/asn1-schema': 2.3.15 - '@peculiar/asn1-x509': 2.3.15 - asn1js: 3.0.6 - tslib: 2.8.1 + '@oxlint/linux-x64-gnu@1.39.0': + optional: true - '@peculiar/asn1-schema@2.3.15': - dependencies: - asn1js: 3.0.6 - pvtsutils: 1.3.6 - tslib: 2.8.1 + '@oxlint/linux-x64-musl@1.39.0': + optional: true - '@peculiar/asn1-x509@2.3.15': - dependencies: - '@peculiar/asn1-schema': 2.3.15 - asn1js: 3.0.6 - pvtsutils: 1.3.6 - tslib: 2.8.1 + '@oxlint/win32-arm64@1.39.0': + optional: true - '@pkgjs/parseargs@0.11.0': + '@oxlint/win32-x64@1.39.0': optional: true + '@panva/hkdf@1.2.1': {} + '@planetscale/database@1.19.0': {} '@polka/url@1.0.0-next.29': {} @@ -10761,7 +9818,7 @@ snapshots: aria-hidden: 1.2.6 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -10885,7 +9942,7 @@ snapshots: aria-hidden: 1.2.6 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -10984,14 +10041,14 @@ snapshots: aria-hidden: 1.2.6 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@floating-ui/react-dom': 2.1.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) @@ -11036,6 +10093,15 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3) @@ -11122,7 +10188,7 @@ snapshots: aria-hidden: 1.2.6 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - react-remove-scroll: 2.7.1(@types/react@19.2.7)(react@19.2.3) + react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3) optionalDependencies: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) @@ -11136,6 +10202,15 @@ snapshots: '@types/react': 19.2.7 '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@radix-ui/react-separator@1.1.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.7 + '@types/react-dom': 19.2.3(@types/react@19.2.7) + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@radix-ui/number': 1.1.1 @@ -11353,144 +10428,159 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@remixicon/react@4.7.0(react@19.2.3)': + '@remixicon/react@4.8.0(react@19.2.3)': dependencies: react: 19.2.3 - '@rolldown/binding-android-arm64@1.0.0-beta.58': + '@rolldown/binding-android-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': + '@rolldown/binding-darwin-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.58': + '@rolldown/binding-darwin-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': + '@rolldown/binding-freebsd-x64@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.59': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.59': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.59': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.59': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.59': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.59': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.58': {} + '@rolldown/pluginutils@1.0.0-beta.59': {} - '@rollup/plugin-replace@6.0.3(rollup@4.40.2)': + '@rollup/plugin-replace@6.0.3(rollup@4.55.1)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) magic-string: 0.30.21 optionalDependencies: - rollup: 4.40.2 + rollup: 4.55.1 - '@rollup/pluginutils@5.1.4(rollup@4.40.2)': + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.40.2 + rollup: 4.55.1 + + '@rollup/rollup-android-arm-eabi@4.55.1': + optional: true + + '@rollup/rollup-android-arm64@4.55.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.40.2': + '@rollup/rollup-darwin-arm64@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.40.2': + '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.40.2': + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.40.2': + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.40.2': + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.40.2': + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.2': + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.2': + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.2': + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.2': + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.2': + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.2': + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.2': + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.2': + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.2': + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.2': + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.40.2': + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.2': + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.2': + '@rollup/rollup-openharmony-arm64@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.2': + '@rollup/rollup-win32-arm64-msvc@4.55.1': optional: true - '@rushstack/node-core-library@5.19.0(@types/node@22.17.1)': + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@rushstack/node-core-library@5.19.1(@types/node@22.19.5)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) ajv-formats: 3.0.1(ajv@8.13.0) - fs-extra: 11.3.0 + fs-extra: 11.3.3 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@rushstack/node-core-library@5.7.0(@types/node@22.17.1)': + '@rushstack/node-core-library@5.7.0(@types/node@22.19.5)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -11498,12 +10588,12 @@ snapshots: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@rushstack/node-core-library@5.7.0(@types/node@22.19.3)': + '@rushstack/node-core-library@5.7.0(@types/node@25.0.6)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -11511,68 +10601,68 @@ snapshots: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.10 + resolve: 1.22.11 semver: 7.5.4 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 - '@rushstack/problem-matcher@0.1.1(@types/node@22.17.1)': + '@rushstack/problem-matcher@0.1.1(@types/node@22.19.5)': optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 '@rushstack/rig-package@0.5.3': dependencies: - resolve: 1.22.10 + resolve: 1.22.11 strip-json-comments: 3.1.1 '@rushstack/rig-package@0.6.0': dependencies: - resolve: 1.22.10 + resolve: 1.22.11 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.14.0(@types/node@22.17.1)': + '@rushstack/terminal@0.14.0(@types/node@22.19.5)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.17.1) + '@rushstack/node-core-library': 5.7.0(@types/node@22.19.5) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@rushstack/terminal@0.14.0(@types/node@22.19.3)': + '@rushstack/terminal@0.14.0(@types/node@25.0.6)': dependencies: - '@rushstack/node-core-library': 5.7.0(@types/node@22.19.3) + '@rushstack/node-core-library': 5.7.0(@types/node@25.0.6) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 - '@rushstack/terminal@0.19.4(@types/node@22.17.1)': + '@rushstack/terminal@0.19.5(@types/node@22.19.5)': dependencies: - '@rushstack/node-core-library': 5.19.0(@types/node@22.17.1) - '@rushstack/problem-matcher': 0.1.1(@types/node@22.17.1) + '@rushstack/node-core-library': 5.19.1(@types/node@22.19.5) + '@rushstack/problem-matcher': 0.1.1(@types/node@22.19.5) supports-color: 8.1.1 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 - '@rushstack/ts-command-line@4.22.6(@types/node@22.17.1)': + '@rushstack/ts-command-line@4.22.6(@types/node@22.19.5)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.17.1) + '@rushstack/terminal': 0.14.0(@types/node@22.19.5) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.22.6(@types/node@22.19.3)': + '@rushstack/ts-command-line@4.22.6(@types/node@25.0.6)': dependencies: - '@rushstack/terminal': 0.14.0(@types/node@22.19.3) + '@rushstack/terminal': 0.14.0(@types/node@25.0.6) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@5.1.4(@types/node@22.17.1)': + '@rushstack/ts-command-line@5.1.5(@types/node@22.19.5)': dependencies: - '@rushstack/terminal': 0.19.4(@types/node@22.17.1) + '@rushstack/terminal': 0.19.5(@types/node@22.19.5) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -11588,7 +10678,7 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/core@3.20.0': + '@shikijs/core@3.21.0': dependencies: '@shikijs/types': 3.13.0 '@shikijs/vscode-textmate': 10.0.2 @@ -11610,7 +10700,7 @@ snapshots: dependencies: '@shikijs/types': 3.13.0 - '@shikijs/rehype@3.20.0': + '@shikijs/rehype@3.21.0': dependencies: '@shikijs/types': 3.13.0 '@types/hast': 3.0.4 @@ -11623,16 +10713,16 @@ snapshots: dependencies: '@shikijs/types': 3.13.0 - '@shikijs/transformers@3.20.0': + '@shikijs/transformers@3.21.0': dependencies: - '@shikijs/core': 3.20.0 + '@shikijs/core': 3.21.0 '@shikijs/types': 3.13.0 - '@shikijs/twoslash@3.20.0(typescript@5.9.3)': + '@shikijs/twoslash@3.21.0(typescript@5.9.3)': dependencies: - '@shikijs/core': 3.20.0 + '@shikijs/core': 3.21.0 '@shikijs/types': 3.13.0 - twoslash: 0.3.4(typescript@5.9.3) + twoslash: 0.3.6(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -11644,26 +10734,12 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@simplewebauthn/browser@13.1.0': {} - - '@simplewebauthn/server@13.1.1': - dependencies: - '@hexagon/base64': 1.1.28 - '@levischuck/tiny-cbor': 0.2.11 - '@peculiar/asn1-android': 2.3.16 - '@peculiar/asn1-ecc': 2.3.15 - '@peculiar/asn1-rsa': 2.3.15 - '@peculiar/asn1-schema': 2.3.15 - '@peculiar/asn1-x509': 2.3.15 - '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} '@sindresorhus/merge-streams@4.0.0': {} - '@standard-schema/spec@1.0.0': {} - '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} @@ -11685,22 +10761,12 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@tabler/icons-react@3.34.1(react@19.2.3)': + '@tabler/icons-react@3.36.1(react@19.2.3)': dependencies: - '@tabler/icons': 3.34.1 + '@tabler/icons': 3.36.1 react: 19.2.3 - '@tabler/icons@3.34.1': {} - - '@tailwindcss/node@4.1.11': - dependencies: - '@ampproject/remapping': 2.3.0 - enhanced-resolve: 5.18.2 - jiti: 2.4.2 - lightningcss: 1.30.1 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.1.11 + '@tabler/icons@3.36.1': {} '@tailwindcss/node@4.1.18': dependencies: @@ -11712,96 +10778,42 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.18 - '@tailwindcss/oxide-android-arm64@4.1.11': - optional: true - '@tailwindcss/oxide-android-arm64@4.1.18': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.11': - optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.18': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.11': - optional: true - '@tailwindcss/oxide-darwin-x64@4.1.18': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.11': - optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': - optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': - optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.11': - optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.18': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.11': - optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.18': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.11': - optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.18': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.11': - optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.18': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': - optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.11': - optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.18': optional: true - '@tailwindcss/oxide@4.1.11': - dependencies: - detect-libc: 2.0.4 - tar: 7.4.3 - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-arm64': 4.1.11 - '@tailwindcss/oxide-darwin-x64': 4.1.11 - '@tailwindcss/oxide-freebsd-x64': 4.1.11 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 - '@tailwindcss/oxide-linux-x64-musl': 4.1.11 - '@tailwindcss/oxide-wasm32-wasi': 4.1.11 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 - '@tailwindcss/oxide@4.1.18': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.1.18 @@ -11817,34 +10829,34 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 - '@tailwindcss/postcss@4.1.11': + '@tailwindcss/postcss@4.1.18': dependencies: '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.1.11 - '@tailwindcss/oxide': 4.1.11 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 postcss: 8.5.6 - tailwindcss: 4.1.11 + tailwindcss: 4.1.18 - '@tailwindcss/vite@4.1.18(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.18(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.18 '@tailwindcss/oxide': 4.1.18 tailwindcss: 4.1.18 - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@tanstack/query-core@5.90.12': {} + '@tanstack/query-core@5.90.16': {} - '@tanstack/query-devtools@5.91.1': {} + '@tanstack/query-devtools@5.92.0': {} - '@tanstack/react-query-devtools@5.91.1(@tanstack/react-query@5.90.12(react@19.2.3))(react@19.2.3)': + '@tanstack/react-query-devtools@5.91.2(@tanstack/react-query@5.90.16(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/query-devtools': 5.91.1 - '@tanstack/react-query': 5.90.12(react@19.2.3) + '@tanstack/query-devtools': 5.92.0 + '@tanstack/react-query': 5.90.16(react@19.2.3) react: 19.2.3 - '@tanstack/react-query@5.90.12(react@19.2.3)': + '@tanstack/react-query@5.90.16(react@19.2.3)': dependencies: - '@tanstack/query-core': 5.90.12 + '@tanstack/query-core': 5.90.16 react: 19.2.3 '@tanstack/react-table@8.21.3(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -11853,35 +10865,22 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@tanstack/react-virtual@3.13.13(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-virtual@3.13.18(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/virtual-core': 3.13.13 + '@tanstack/virtual-core': 3.13.18 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) '@tanstack/table-core@8.21.3': {} - '@tanstack/virtual-core@3.13.13': {} - - '@tanstack/vite-config@0.2.0(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2))': - dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.40.2) - vite-plugin-dts: 4.2.3(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - typescript - - vite + '@tanstack/virtual-core@3.13.18': {} - '@tanstack/vite-config@0.2.0(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/vite-config@0.2.1(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.40.2) - vite-plugin-dts: 4.2.3(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.55.1) + vite-plugin-dts: 4.2.3(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - rollup @@ -11889,12 +10888,12 @@ snapshots: - typescript - vite - '@tanstack/vite-config@0.2.0(@types/node@22.19.3)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@tanstack/vite-config@0.2.1(@types/node@25.0.6)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - rollup-plugin-preserve-directives: 0.4.0(rollup@4.40.2) - vite-plugin-dts: 4.2.3(@types/node@22.19.3)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - vite-plugin-externalize-deps: 0.9.0(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + rollup-plugin-preserve-directives: 0.4.0(rollup@4.55.1) + vite-plugin-dts: 4.2.3(@types/node@25.0.6)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + vite-plugin-externalize-deps: 0.9.0(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + vite-tsconfig-paths: 5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) transitivePeerDependencies: - '@types/node' - rollup @@ -11908,20 +10907,20 @@ snapshots: dependencies: '@trpc/server': 11.0.0-rc.441 - '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@trpc/server@11.0.0-rc.441)(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@trpc/next@11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@trpc/server@11.0.0-rc.441)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@trpc/client': 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/server': 11.0.0-rc.441 - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@tanstack/react-query': 5.90.12(react@19.2.3) - '@trpc/react-query': 11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-query': 5.90.16(react@19.2.3) + '@trpc/react-query': 11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.12(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@trpc/react-query@11.0.0-rc.441(@tanstack/react-query@5.90.16(react@19.2.3))(@trpc/client@11.0.0-rc.441(@trpc/server@11.0.0-rc.441))(@trpc/server@11.0.0-rc.441)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/react-query': 5.90.12(react@19.2.3) + '@tanstack/react-query': 5.90.16(react@19.2.3) '@trpc/client': 11.0.0-rc.441(@trpc/server@11.0.0-rc.441) '@trpc/server': 11.0.0-rc.441 react: 19.2.3 @@ -11943,7 +10942,7 @@ snapshots: '@ts-morph/common@0.27.0': dependencies: fast-glob: 3.3.3 - minimatch: 10.0.3 + minimatch: 10.1.1 path-browserify: 1.0.1 '@ts-morph/common@0.28.1': @@ -11961,39 +10960,40 @@ snapshots: '@types/axios@0.14.4': dependencies: - axios: 1.9.0 + axios: 1.13.2 transitivePeerDependencies: - debug '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.3 - '@babel/types': 7.28.2 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.2 + '@babel/types': 7.28.5 '@types/better-sqlite3@7.6.13': dependencies: - '@types/node': 22.19.3 + '@types/node': 22.19.5 optional: true - '@types/chai@5.2.2': + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 '@types/cookie@0.6.0': {} @@ -12007,8 +11007,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/estree@1.0.7': {} - '@types/estree@1.0.8': {} '@types/filemaker-webviewer@1.0.3': {} @@ -12016,12 +11014,12 @@ snapshots: '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.17.1 + '@types/node': 25.0.6 '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.17.1 + '@types/node': 22.19.5 '@types/gradient-string@1.1.6': dependencies: @@ -12048,7 +11046,7 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.17.1 + '@types/node': 25.0.6 '@types/mdast@4.0.4': dependencies: @@ -12062,18 +11060,21 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.17.1': + '@types/node@20.19.28': dependencies: undici-types: 6.21.0 - '@types/node@22.19.3': + '@types/node@22.19.5': dependencies: undici-types: 6.21.0 - optional: true + + '@types/node@25.0.6': + dependencies: + undici-types: 7.16.0 '@types/prompts@2.4.9': dependencies: - '@types/node': 22.17.1 + '@types/node': 25.0.6 kleur: 3.0.3 '@types/randomstring@1.3.0': {} @@ -12086,7 +11087,7 @@ snapshots: dependencies: csstype: 3.2.3 - '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} '@types/stack-utils@2.0.3': {} @@ -12094,34 +11095,27 @@ snapshots: '@types/tinycolor2@1.4.6': {} - '@types/tough-cookie@4.0.5': {} - '@types/unist@2.0.11': {} '@types/unist@3.0.3': {} '@types/uuid@10.0.0': {} + '@types/whatwg-mimetype@3.0.2': {} + '@types/ws@8.18.1': dependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 '@types/yargs-parser@21.0.3': {} - '@types/yargs@17.0.33': + '@types/yargs@17.0.35': dependencies: '@types/yargs-parser': 21.0.3 - '@typescript/vfs@1.6.1(typescript@5.9.3)': - dependencies: - debug: 4.4.1(supports-color@5.5.0) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript/vfs@1.6.2(typescript@5.9.3)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -12133,11 +11127,11 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@upstash/redis@1.34.9': + '@upstash/redis@1.36.1': dependencies: - crypto-js: 4.2.0 + uncrypto: 0.1.3 - '@vitejs/plugin-react@4.7.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -12145,167 +11139,158 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.9(vitest@4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@2.1.9(vitest@4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 magicast: 0.3.5 - std-env: 3.9.0 + std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@2.1.9(vitest@4.0.15(@types/node@22.19.3)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@2.1.9(vitest@4.0.17(@types/node@25.0.6)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 + istanbul-reports: 3.2.0 + magic-string: 0.30.21 magicast: 0.3.5 - std-env: 3.9.0 + std-env: 3.10.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 4.0.15(@types/node@22.19.3)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.17(@types/node@25.0.6)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.15': + '@vitest/expect@4.0.17': dependencies: - '@standard-schema/spec': 1.0.0 - '@types/chai': 5.2.2 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 - chai: 6.2.1 + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': - dependencies: - '@vitest/spy': 4.0.15 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.3) - vite: 6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - - '@vitest/mocker@4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.3) - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) + msw: 2.12.7(@types/node@22.19.5)(typescript@5.9.3) + vite: 6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.3) - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + msw: 2.12.7(@types/node@22.19.5)(typescript@5.9.3) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.15(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(vite@6.3.5(@types/node@22.19.3)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(vite@6.4.1(@types/node@25.0.6)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@22.19.3)(typescript@5.9.3) - vite: 6.3.5(@types/node@22.19.3)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + msw: 2.12.7(@types/node@25.0.6)(typescript@5.9.3) + vite: 6.4.1(@types/node@25.0.6)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - '@vitest/mocker@4.0.15(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.17(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@vitest/spy': 4.0.15 + '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@22.19.3)(typescript@5.9.3) - vite: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + msw: 2.12.7(@types/node@25.0.6)(typescript@5.9.3) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.15': + '@vitest/pretty-format@4.0.17': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.15': + '@vitest/runner@4.0.17': dependencies: - '@vitest/utils': 4.0.15 + '@vitest/utils': 4.0.17 pathe: 2.0.3 - '@vitest/snapshot@4.0.15': + '@vitest/snapshot@4.0.17': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.17 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.15': {} + '@vitest/spy@4.0.17': {} - '@vitest/ui@3.2.4(vitest@4.0.15)': + '@vitest/ui@3.2.4(vitest@4.0.17)': dependencies: '@vitest/utils': 3.2.4 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 - sirv: 3.0.1 - tinyglobby: 0.2.14 + sirv: 3.0.2 + tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 4.0.15(@types/node@22.19.3)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.17(@types/node@25.0.6)(@vitest/ui@3.2.4)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - loupe: 3.2.0 + loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@4.0.15': + '@vitest/utils@4.0.17': dependencies: - '@vitest/pretty-format': 4.0.15 + '@vitest/pretty-format': 4.0.17 tinyrainbow: 3.0.3 - '@volar/language-core@2.4.14': + '@volar/language-core@2.4.27': dependencies: - '@volar/source-map': 2.4.14 + '@volar/source-map': 2.4.27 - '@volar/source-map@2.4.14': {} + '@volar/source-map@2.4.27': {} - '@volar/typescript@2.4.14': + '@volar/typescript@2.4.27': dependencies: - '@volar/language-core': 2.4.14 + '@volar/language-core': 2.4.27 path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.14': + '@vue/compiler-core@3.5.26': dependencies: '@babel/parser': 7.28.5 - '@vue/shared': 3.5.14 - entities: 4.5.0 + '@vue/shared': 3.5.26 + entities: 7.0.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.14': + '@vue/compiler-dom@3.5.26': dependencies: - '@vue/compiler-core': 3.5.14 - '@vue/shared': 3.5.14 + '@vue/compiler-core': 3.5.26 + '@vue/shared': 3.5.26 '@vue/compiler-vue2@2.7.16': dependencies: @@ -12314,10 +11299,10 @@ snapshots: '@vue/language-core@2.1.6(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.4.14 - '@vue/compiler-dom': 3.5.14 + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.14 + '@vue/shared': 3.5.26 computeds: 0.0.1 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -12327,10 +11312,10 @@ snapshots: '@vue/language-core@2.2.0(typescript@5.9.3)': dependencies: - '@volar/language-core': 2.4.14 - '@vue/compiler-dom': 3.5.14 + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.14 + '@vue/shared': 3.5.26 alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 @@ -12338,18 +11323,18 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@vue/shared@3.5.14': {} + '@vue/shared@3.5.26': {} accepts@2.0.0: dependencies: - mime-types: 3.0.1 + mime-types: 3.0.2 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@7.1.4: {} @@ -12361,12 +11346,9 @@ snapshots: optionalDependencies: ajv: 8.13.0 - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 ajv@8.12.0: dependencies: @@ -12382,15 +11364,18 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + alien-signals@0.4.14: {} ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-escapes@7.0.0: + ansi-escapes@7.2.0: dependencies: environment: 1.1.0 @@ -12398,7 +11383,7 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.2: {} ansi-styles@3.2.1: dependencies: @@ -12410,9 +11395,9 @@ snapshots: ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} - ansis@4.1.0: {} + ansis@4.2.0: {} any-promise@1.3.0: {} @@ -12433,11 +11418,7 @@ snapshots: array-union@2.1.0: {} - asn1js@3.0.6: - dependencies: - pvtsutils: 1.3.6 - pvutils: 1.1.3 - tslib: 2.8.1 + assertion-error@2.0.1: {} ast-kit@2.2.0: dependencies: @@ -12454,10 +11435,10 @@ snapshots: aws-ssl-profiles@1.1.2: {} - axios@1.9.0: + axios@1.13.2: dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.2 + follow-redirects: 1.15.11 + form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -12468,29 +11449,39 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.9.14: {} - better-auth@1.2.10: + better-auth@1.4.11(@prisma/client@5.22.0(prisma@5.22.0))(mysql2@3.16.0)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(prisma@5.22.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(vitest@4.0.17): dependencies: - '@better-auth/utils': 0.2.5 - '@better-fetch/fetch': 1.1.18 - '@noble/ciphers': 0.6.0 - '@noble/hashes': 1.8.0 - '@simplewebauthn/browser': 13.1.0 - '@simplewebauthn/server': 13.1.1 - better-call: 1.0.9 + '@better-auth/core': 1.4.11(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0) + '@better-auth/telemetry': 1.4.11(@better-auth/core@1.4.11(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.7(zod@4.3.5))(jose@6.1.3)(kysely@0.28.9)(nanostores@1.1.0)) + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.21 + '@noble/ciphers': 2.1.1 + '@noble/hashes': 2.0.1 + better-call: 1.1.7(zod@4.3.5) defu: 6.1.4 - jose: 5.10.0 - kysely: 0.28.2 - nanostores: 0.11.4 - zod: 3.25.76 + jose: 6.1.3 + kysely: 0.28.9 + nanostores: 1.1.0 + zod: 4.3.5 + optionalDependencies: + '@prisma/client': 5.22.0(prisma@5.22.0) + mysql2: 3.16.0 + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + prisma: 5.22.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + vitest: 4.0.17(@types/node@25.0.6)(@vitest/ui@3.2.4)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2) - better-call@1.0.9: + better-call@1.1.7(zod@4.3.5): dependencies: - '@better-fetch/fetch': 1.1.17 - rou3: 0.5.1 - set-cookie-parser: 2.7.1 - uncrypto: 0.1.3 + '@better-auth/utils': 0.3.0 + '@better-fetch/fetch': 1.1.21 + rou3: 0.7.12 + set-cookie-parser: 2.7.2 + optionalDependencies: + zod: 4.3.5 better-path-resolve@1.0.0: dependencies: @@ -12524,26 +11515,26 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@2.2.0: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.1(supports-color@5.5.0) - http-errors: 2.0.0 - iconv-lite: 0.6.3 + debug: 4.4.3(supports-color@5.5.0) + http-errors: 2.0.1 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.0 - raw-body: 3.0.0 + qs: 6.14.1 + raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -12551,12 +11542,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.25.1: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001761 - electron-to-chromium: 1.5.177 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-from@1.1.2: {} @@ -12573,22 +11565,22 @@ snapshots: bundle-name@4.1.0: dependencies: - run-applescript: 7.0.0 + run-applescript: 7.1.0 bytes@3.1.2: {} - c12@3.0.4(magicast@0.3.5): + c12@3.3.3(magicast@0.3.5): dependencies: - chokidar: 4.0.3 + chokidar: 5.0.0 confbox: 0.2.2 defu: 6.1.4 - dotenv: 16.5.0 - exsolve: 1.0.7 + dotenv: 17.2.3 + exsolve: 1.0.8 giget: 2.0.0 - jiti: 2.4.2 + jiti: 2.6.1 ohash: 2.0.11 pathe: 2.0.3 - perfect-debounce: 1.0.0 + perfect-debounce: 2.0.0 pkg-types: 2.3.0 rc9: 2.1.2 optionalDependencies: @@ -12610,11 +11602,11 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001761: {} + caniuse-lite@1.0.30001764: {} ccount@2.0.1: {} - chai@6.2.1: {} + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -12623,6 +11615,8 @@ snapshots: chalk@5.4.1: {} + chalk@5.6.2: {} + char-regex@1.0.2: {} character-entities-html4@2.1.0: {} @@ -12633,7 +11627,7 @@ snapshots: character-reference-invalid@2.0.1: {} - chardet@0.7.0: {} + chardet@2.1.1: {} chokidar-cli@3.0.0: dependencies: @@ -12665,8 +11659,6 @@ snapshots: chownr@1.1.4: optional: true - chownr@3.0.0: {} - ci-info@3.9.0: {} citty@0.1.6: @@ -12748,7 +11740,7 @@ snapshots: '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: @@ -12783,8 +11775,6 @@ snapshots: commander@10.0.1: {} - commander@14.0.0: {} - commander@14.0.2: {} commander@9.5.0: {} @@ -12815,9 +11805,7 @@ snapshots: consola@3.4.2: {} - content-disposition@1.0.0: - dependencies: - safe-buffer: 5.2.1 + content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -12829,9 +11817,11 @@ snapshots: cookie@0.7.2: {} - copy-anything@3.0.5: + cookie@1.1.1: {} + + copy-anything@4.0.5: dependencies: - is-what: 4.1.16 + is-what: 5.5.0 cors@2.8.5: dependencies: @@ -12841,7 +11831,7 @@ snapshots: cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -12853,8 +11843,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crypto-js@4.2.0: {} - cssesc@3.0.0: {} csstype@3.2.3: {} @@ -12868,26 +11856,18 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.4 de-indent@1.0.2: {} - debug@4.4.1(supports-color@5.5.0): + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 optionalDependencies: supports-color: 5.5.0 - debug@4.4.3: - dependencies: - ms: 2.1.3 - decamelize@1.2.0: {} - decode-named-character-reference@1.1.0: - dependencies: - character-entities: 2.0.2 - decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 @@ -12902,12 +11882,12 @@ snapshots: deepmerge@4.3.1: {} - default-browser-id@5.0.0: {} + default-browser-id@5.0.1: {} - default-browser@5.2.1: + default-browser@5.4.0: dependencies: bundle-name: 4.1.0 - default-browser-id: 5.0.0 + default-browser-id: 5.0.1 defaults@1.0.4: dependencies: @@ -12929,12 +11909,10 @@ snapshots: detect-indent@6.1.0: {} - detect-indent@7.0.1: {} + detect-indent@7.0.2: {} detect-libc@2.0.2: {} - detect-libc@2.0.4: {} - detect-libc@2.1.2: {} detect-newline@4.0.1: {} @@ -12959,7 +11937,9 @@ snapshots: dependencies: path-type: 4.0.0 - dotenv@16.5.0: {} + dotenv@16.6.1: {} + + dotenv@17.2.3: {} dreamopt@0.8.0: dependencies: @@ -12972,26 +11952,28 @@ snapshots: env-paths: 3.0.0 esbuild: 0.19.12 esbuild-register: 3.6.0(esbuild@0.19.12) - glob: 8.1.0 + glob: 11.1.0 hanji: 0.0.5 json-diff: 0.9.0 zod: 3.25.76 transitivePeerDependencies: - supports-color - drizzle-orm@0.30.10(@libsql/client@0.6.2)(@planetscale/database@1.19.0)(@types/better-sqlite3@7.6.13)(@types/react@19.2.7)(better-sqlite3@11.10.0)(kysely@0.28.2)(mysql2@3.14.1)(postgres@3.4.5)(react@19.2.3): + drizzle-orm@0.30.10(@libsql/client@0.6.2)(@planetscale/database@1.19.0)(@types/better-sqlite3@7.6.13)(@types/react@19.2.7)(better-sqlite3@11.10.0)(kysely@0.28.9)(mysql2@3.16.0)(postgres@3.4.8)(react@19.2.3): optionalDependencies: '@libsql/client': 0.6.2 '@planetscale/database': 1.19.0 '@types/better-sqlite3': 7.6.13 '@types/react': 19.2.7 better-sqlite3: 11.10.0 - kysely: 0.28.2 - mysql2: 3.14.1 - postgres: 3.4.5 + kysely: 0.28.9 + mysql2: 3.16.0 + postgres: 3.4.8 react: 19.2.3 - dts-resolver@2.1.3: {} + dts-resolver@2.1.3(oxc-resolver@11.16.2): + optionalDependencies: + oxc-resolver: 11.16.2 dunder-proto@1.0.1: dependencies: @@ -13003,7 +11985,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.177: {} + electron-to-chromium@1.5.267: {} emoji-regex@10.6.0: {} @@ -13024,28 +12006,23 @@ snapshots: once: 1.4.0 optional: true - enhanced-resolve@5.18.2: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.2 - enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.2 + tapable: 2.3.0 enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - entities@4.5.0: {} + entities@7.0.0: {} env-paths@3.0.0: {} environment@1.1.0: {} - error-ex@1.3.2: + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -13066,7 +12043,7 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-toolkit@1.38.0: {} + es-toolkit@1.43.0: {} es5-ext@0.10.64: dependencies: @@ -13103,13 +12080,13 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.14.1 + acorn: 8.15.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 esbuild-register@3.6.0(esbuild@0.19.12): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) esbuild: 0.19.12 transitivePeerDependencies: - supports-color @@ -13165,91 +12142,34 @@ snapshots: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 - esbuild@0.25.4: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.4 - '@esbuild/android-arm': 0.25.4 - '@esbuild/android-arm64': 0.25.4 - '@esbuild/android-x64': 0.25.4 - '@esbuild/darwin-arm64': 0.25.4 - '@esbuild/darwin-x64': 0.25.4 - '@esbuild/freebsd-arm64': 0.25.4 - '@esbuild/freebsd-x64': 0.25.4 - '@esbuild/linux-arm': 0.25.4 - '@esbuild/linux-arm64': 0.25.4 - '@esbuild/linux-ia32': 0.25.4 - '@esbuild/linux-loong64': 0.25.4 - '@esbuild/linux-mips64el': 0.25.4 - '@esbuild/linux-ppc64': 0.25.4 - '@esbuild/linux-riscv64': 0.25.4 - '@esbuild/linux-s390x': 0.25.4 - '@esbuild/linux-x64': 0.25.4 - '@esbuild/netbsd-arm64': 0.25.4 - '@esbuild/netbsd-x64': 0.25.4 - '@esbuild/openbsd-arm64': 0.25.4 - '@esbuild/openbsd-x64': 0.25.4 - '@esbuild/sunos-x64': 0.25.4 - '@esbuild/win32-arm64': 0.25.4 - '@esbuild/win32-ia32': 0.25.4 - '@esbuild/win32-x64': 0.25.4 - - esbuild@0.25.8: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.8 - '@esbuild/android-arm': 0.25.8 - '@esbuild/android-arm64': 0.25.8 - '@esbuild/android-x64': 0.25.8 - '@esbuild/darwin-arm64': 0.25.8 - '@esbuild/darwin-x64': 0.25.8 - '@esbuild/freebsd-arm64': 0.25.8 - '@esbuild/freebsd-x64': 0.25.8 - '@esbuild/linux-arm': 0.25.8 - '@esbuild/linux-arm64': 0.25.8 - '@esbuild/linux-ia32': 0.25.8 - '@esbuild/linux-loong64': 0.25.8 - '@esbuild/linux-mips64el': 0.25.8 - '@esbuild/linux-ppc64': 0.25.8 - '@esbuild/linux-riscv64': 0.25.8 - '@esbuild/linux-s390x': 0.25.8 - '@esbuild/linux-x64': 0.25.8 - '@esbuild/netbsd-arm64': 0.25.8 - '@esbuild/netbsd-x64': 0.25.8 - '@esbuild/openbsd-arm64': 0.25.8 - '@esbuild/openbsd-x64': 0.25.8 - '@esbuild/openharmony-arm64': 0.25.8 - '@esbuild/sunos-x64': 0.25.8 - '@esbuild/win32-arm64': 0.25.8 - '@esbuild/win32-ia32': 0.25.8 - '@esbuild/win32-x64': 0.25.8 - - esbuild@0.27.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.1 - '@esbuild/android-arm': 0.27.1 - '@esbuild/android-arm64': 0.27.1 - '@esbuild/android-x64': 0.27.1 - '@esbuild/darwin-arm64': 0.27.1 - '@esbuild/darwin-x64': 0.27.1 - '@esbuild/freebsd-arm64': 0.27.1 - '@esbuild/freebsd-x64': 0.27.1 - '@esbuild/linux-arm': 0.27.1 - '@esbuild/linux-arm64': 0.27.1 - '@esbuild/linux-ia32': 0.27.1 - '@esbuild/linux-loong64': 0.27.1 - '@esbuild/linux-mips64el': 0.27.1 - '@esbuild/linux-ppc64': 0.27.1 - '@esbuild/linux-riscv64': 0.27.1 - '@esbuild/linux-s390x': 0.27.1 - '@esbuild/linux-x64': 0.27.1 - '@esbuild/netbsd-arm64': 0.27.1 - '@esbuild/netbsd-x64': 0.27.1 - '@esbuild/openbsd-arm64': 0.27.1 - '@esbuild/openbsd-x64': 0.27.1 - '@esbuild/openharmony-arm64': 0.27.1 - '@esbuild/sunos-x64': 0.27.1 - '@esbuild/win32-arm64': 0.27.1 - '@esbuild/win32-ia32': 0.27.1 - '@esbuild/win32-x64': 0.27.1 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 esbuild@0.27.2: optionalDependencies: @@ -13319,7 +12239,7 @@ snapshots: dependencies: '@types/estree-jsx': 1.0.5 astring: 1.9.0 - source-map: 0.7.4 + source-map: 0.7.6 estree-util-value-to-estree@3.5.0: dependencies: @@ -13345,11 +12265,11 @@ snapshots: eventemitter3@5.0.1: {} - eventsource-parser@3.0.3: {} + eventsource-parser@3.0.6: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.3 + eventsource-parser: 3.0.6 execa@7.2.0: dependencies: @@ -13363,7 +12283,7 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - execa@9.5.3: + execa@9.6.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 @@ -13373,15 +12293,15 @@ snapshots: is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 - pretty-ms: 9.2.0 + pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 + yoctocolors: 2.1.2 expand-template@2.0.3: optional: true - expect-type@1.2.2: {} + expect-type@1.3.0: {} expect@29.7.0: dependencies: @@ -13391,43 +12311,44 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express-rate-limit@7.5.1(express@5.1.0): + express-rate-limit@7.5.1(express@5.2.1): dependencies: - express: 5.1.0 + express: 5.2.1 - express@5.1.0: + express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.0 - content-disposition: 1.0.0 + body-parser: 2.2.2 + content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) + depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.0 + finalhandler: 2.1.1 fresh: 2.0.0 - http-errors: 2.0.0 + http-errors: 2.0.1 merge-descriptors: 2.0.0 - mime-types: 3.0.1 + mime-types: 3.0.2 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - exsolve@1.0.7: {} + exsolve@1.0.8: {} ext@1.7.0: dependencies: @@ -13437,12 +12358,6 @@ snapshots: extendable-error@0.1.7: {} - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -13453,27 +12368,19 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} + fast-uri@3.1.0: {} - fast-xml-parser@5.3.2: + fast-xml-parser@5.3.3: dependencies: - strnum: 2.1.1 + strnum: 2.1.2 - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 - fd-package-json@1.2.0: + fd-package-json@2.0.0: dependencies: - walk-up-path: 3.0.1 - - fdir@6.4.4(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fdir@6.4.6(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + walk-up-path: 4.0.0 fdir@6.5.0(picomatch@4.0.3): optionalDependencies: @@ -13494,8 +12401,8 @@ snapshots: dependencies: get-stream: 9.0.1 strtok3: 9.1.1 - token-types: 6.0.0 - uint8array-extras: 1.4.0 + token-types: 6.1.2 + uint8array-extras: 1.5.0 file-uri-to-path@1.0.0: optional: true @@ -13504,9 +12411,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.0: + finalhandler@2.1.1: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -13526,27 +12433,28 @@ snapshots: flatted@3.3.3: {} - fm-odata-client@3.0.1: + fm-odata-client@3.0.2: dependencies: file-type: 19.6.0 - follow-redirects@1.15.9: {} + follow-redirects@1.15.11: {} foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: + form-data@4.0.5: 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 - formatly@0.2.3: + formatly@0.3.0: dependencies: - fd-package-json: 1.2.0 + fd-package-json: 2.0.0 formdata-polyfill@4.0.10: dependencies: @@ -13559,10 +12467,10 @@ snapshots: fs-constants@1.0.0: optional: true - fs-extra@11.3.0: + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.1.0 + jsonfile: 6.2.0 universalify: 2.0.1 fs-extra@7.0.1: @@ -13577,17 +12485,15 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs.realpath@1.0.0: {} - fsevents@2.3.3: optional: true - fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5): + fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5): dependencies: '@formatjs/intl-localematcher': 0.7.5 '@orama/orama': 3.1.18 - '@shikijs/rehype': 3.20.0 - '@shikijs/transformers': 3.20.0 + '@shikijs/rehype': 3.21.0 + '@shikijs/transformers': 3.21.0 estree-util-value-to-estree: 3.5.0 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 @@ -13606,19 +12512,19 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 lucide-react: 0.511.0(react@19.2.3) - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) zod: 4.3.5 transitivePeerDependencies: - supports-color - fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5): + fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5): dependencies: '@formatjs/intl-localematcher': 0.7.5 '@orama/orama': 3.1.18 - '@shikijs/rehype': 3.20.0 - '@shikijs/transformers': 3.20.0 + '@shikijs/rehype': 3.21.0 + '@shikijs/transformers': 3.21.0 estree-util-value-to-estree: 3.5.0 github-slugger: 2.0.0 hast-util-to-estree: 3.1.3 @@ -13637,21 +12543,21 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 lucide-react: 0.562.0(react@19.2.3) - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) zod: 4.3.5 transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.4(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.4(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 chokidar: 5.0.0 esbuild: 0.27.2 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) + fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) js-yaml: 4.1.1 mdast-util-to-markdown: 2.1.2 picocolors: 1.1.1 @@ -13666,17 +12572,17 @@ snapshots: zod: 4.3.5 optionalDependencies: '@types/react': 19.2.7 - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 - vite: 6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - fumadocs-twoslash@3.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3): + fumadocs-twoslash@3.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3): dependencies: '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@shikijs/twoslash': 3.20.0(typescript@5.9.3) - fumadocs-ui: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5) + '@shikijs/twoslash': 3.21.0(typescript@5.9.3) + fumadocs-ui: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5) mdast-util-from-markdown: 2.0.2 mdast-util-gfm: 3.1.0 mdast-util-to-hast: 13.2.1 @@ -13692,10 +12598,10 @@ snapshots: - supports-color - typescript - fumadocs-typescript@5.0.1(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3): + fumadocs-typescript@5.0.1(@types/react@19.2.7)(fumadocs-core@16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5))(react@19.2.3)(typescript@5.9.3): dependencies: estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) + fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.511.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) hast-util-to-estree: 3.1.3 hast-util-to-jsx-runtime: 2.3.6 react: 19.2.3 @@ -13707,13 +12613,13 @@ snapshots: unist-util-visit: 5.0.0 optionalDependencies: '@types/react': 19.2.7 - fumadocs-ui: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5) + fumadocs-ui: 16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5) transitivePeerDependencies: - supports-color - fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5): + fumadocs-ui@16.4.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5): dependencies: - '@fumadocs/ui': 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.11)(zod@4.3.5) + '@fumadocs/ui': 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.3.5) '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -13725,7 +12631,7 @@ snapshots: '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3) '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) class-variance-authority: 0.7.1 - fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) + fumadocs-core: 16.4.4(@types/react@19.2.7)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) lucide-react: 0.562.0(react@19.2.3) next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 @@ -13734,7 +12640,7 @@ snapshots: scroll-into-view-if-needed: 3.1.0 optionalDependencies: '@types/react': 19.2.7 - tailwindcss: 4.1.11 + tailwindcss: 4.1.18 transitivePeerDependencies: - '@mixedbread/sdk' - '@orama/core' @@ -13791,10 +12697,6 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.10.1: - dependencies: - resolve-pkg-maps: 1.0.0 - get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -13804,8 +12706,8 @@ snapshots: citty: 0.1.6 consola: 3.4.2 defu: 6.1.4 - node-fetch-native: 1.6.6 - nypm: 0.6.0 + node-fetch-native: 1.6.7 + nypm: 0.6.2 pathe: 2.0.3 git-hooks-list@3.2.0: {} @@ -13819,39 +12721,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: + glob@11.1.0: dependencies: foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - glob@11.0.2: - dependencies: - foreground-child: 3.3.1 - jackspeak: 4.1.0 - minimatch: 10.0.1 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 - - glob@13.0.0: - dependencies: + jackspeak: 4.1.1 minimatch: 10.1.1 minipass: 7.1.2 - path-scurry: 2.0.0 - - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - globals@11.12.0: {} + package-json-from-dist: 1.0.1 + path-scurry: 2.0.1 globby@11.1.0: dependencies: @@ -13873,7 +12750,7 @@ snapshots: chalk: 4.1.2 tinygradient: 1.1.5 - graphql@16.11.0: {} + graphql@16.12.0: {} handlebars@4.7.8: dependencies: @@ -13889,11 +12766,16 @@ snapshots: lodash.throttle: 4.1.1 sisteransi: 1.0.5 - happy-dom@15.11.7: + happy-dom@20.1.0: dependencies: - entities: 4.5.0 - webidl-conversions: 7.0.0 + '@types/node': 20.19.28 + '@types/whatwg-mimetype': 3.0.2 + '@types/ws': 8.18.1 whatwg-mimetype: 3.0.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate has-flag@3.0.0: {} @@ -13924,7 +12806,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 + style-to-js: 1.1.21 unist-util-position: 5.0.0 zwitch: 2.0.4 transitivePeerDependencies: @@ -13958,7 +12840,7 @@ snapshots: mdast-util-mdxjs-esm: 2.0.1 property-information: 7.1.0 space-separated-tokens: 2.0.2 - style-to-js: 1.1.17 + style-to-js: 1.1.21 unist-util-position: 5.0.0 vfile-message: 4.0.3 transitivePeerDependencies: @@ -13980,7 +12862,7 @@ snapshots: highlight.js@10.7.3: {} - hono@4.9.0: {} + hono@4.11.3: {} hookable@5.5.3: {} @@ -13988,22 +12870,22 @@ snapshots: html-void-elements@3.0.0: {} - http-errors@2.0.0: + http-errors@2.0.1: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 https-proxy-agent@6.2.1: dependencies: agent-base: 7.1.4 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - human-id@4.1.1: {} + human-id@4.1.3: {} human-signals@4.3.1: {} @@ -14011,11 +12893,7 @@ snapshots: husky@9.1.7: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -14034,17 +12912,12 @@ snapshots: import-lazy@4.0.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - inherits@2.0.4: {} ini@1.3.8: optional: true - inline-style-parser@0.2.4: {} + inline-style-parser@0.2.7: {} ipaddr.js@1.9.1: {} @@ -14119,7 +12992,7 @@ snapshots: is-unicode-supported@2.1.0: {} - is-what@4.1.16: {} + is-what@5.5.0: {} is-windows@1.0.2: {} @@ -14139,24 +13012,18 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 - debug: 4.4.1(supports-color@5.5.0) + '@jridgewell/trace-mapping': 0.3.31 + debug: 4.4.3(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@4.1.0: + jackspeak@4.1.1: dependencies: '@isaacs/cliui': 8.0.2 @@ -14191,7 +13058,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.17.1 + '@types/node': 22.19.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -14199,8 +13066,6 @@ snapshots: jiti@1.21.7: {} - jiti@2.4.2: {} - jiti@2.6.1: {} jju@1.4.0: {} @@ -14209,21 +13074,17 @@ snapshots: jose@5.10.0: {} - jose@6.0.11: {} + jose@6.1.3: {} - js-base64@3.7.7: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} - js-yaml@3.14.1: + js-yaml@3.14.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -14238,10 +13099,10 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -14250,7 +13111,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + jsonfile@6.2.0: dependencies: universalify: 2.0.1 optionalDependencies: @@ -14260,27 +13121,26 @@ snapshots: kleur@4.1.5: {} - knip@5.56.0(@types/node@22.17.1)(typescript@5.9.3): + knip@5.80.2(@types/node@22.19.5)(typescript@5.9.3): dependencies: '@nodelib/fs.walk': 1.2.8 - '@types/node': 22.17.1 + '@types/node': 22.19.5 fast-glob: 3.3.3 - formatly: 0.2.3 - jiti: 2.4.2 - js-yaml: 4.1.0 + formatly: 0.3.0 + jiti: 2.6.1 + js-yaml: 4.1.1 minimist: 1.2.8 - oxc-resolver: 9.0.2 + oxc-resolver: 11.16.2 picocolors: 1.1.1 - picomatch: 4.0.2 - smol-toml: 1.3.4 - strip-json-comments: 5.0.1 + picomatch: 4.0.3 + smol-toml: 1.6.0 + strip-json-comments: 5.0.3 typescript: 5.9.3 - zod: 3.25.76 - zod-validation-error: 3.4.1(zod@3.25.76) + zod: 4.3.5 kolorist@1.8.0: {} - kysely@0.28.2: {} + kysely@0.28.9: {} libsql@0.3.19: dependencies: @@ -14298,81 +13158,36 @@ snapshots: lightningcss-android-arm64@1.30.2: optional: true - lightningcss-darwin-arm64@1.30.1: - optional: true - lightningcss-darwin-arm64@1.30.2: optional: true - lightningcss-darwin-x64@1.30.1: - optional: true - lightningcss-darwin-x64@1.30.2: optional: true - lightningcss-freebsd-x64@1.30.1: - optional: true - lightningcss-freebsd-x64@1.30.2: optional: true - lightningcss-linux-arm-gnueabihf@1.30.1: - optional: true - lightningcss-linux-arm-gnueabihf@1.30.2: optional: true - lightningcss-linux-arm64-gnu@1.30.1: - optional: true - lightningcss-linux-arm64-gnu@1.30.2: optional: true - lightningcss-linux-arm64-musl@1.30.1: - optional: true - lightningcss-linux-arm64-musl@1.30.2: optional: true - lightningcss-linux-x64-gnu@1.30.1: - optional: true - lightningcss-linux-x64-gnu@1.30.2: optional: true - lightningcss-linux-x64-musl@1.30.1: - optional: true - lightningcss-linux-x64-musl@1.30.2: optional: true - lightningcss-win32-arm64-msvc@1.30.1: - optional: true - lightningcss-win32-arm64-msvc@1.30.2: optional: true - lightningcss-win32-x64-msvc@1.30.1: - optional: true - lightningcss-win32-x64-msvc@1.30.2: optional: true - lightningcss@1.30.1: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - lightningcss@1.30.2: dependencies: detect-libc: 2.1.2 @@ -14412,12 +13227,12 @@ snapshots: local-pkg@0.5.1: dependencies: - mlly: 1.7.4 + mlly: 1.8.0 pkg-types: 1.3.1 local-pkg@1.1.2: dependencies: - mlly: 1.7.4 + mlly: 1.8.0 pkg-types: 2.3.0 quansync: 0.2.11 @@ -14445,21 +13260,21 @@ snapshots: log-update@6.1.0: dependencies: - ansi-escapes: 7.0.0 + ansi-escapes: 7.2.0 cli-cursor: 5.0.0 slice-ansi: 7.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi: 9.0.2 long@5.3.2: {} longest-streak@3.1.0: {} - loupe@3.2.0: {} + loupe@3.2.1: {} lru-cache@10.4.3: {} - lru-cache@11.1.0: {} + lru-cache@11.2.4: {} lru-cache@5.1.1: dependencies: @@ -14469,13 +13284,11 @@ snapshots: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - lru-queue@0.1.0: dependencies: es5-ext: 0.10.64 - lru.min@1.1.2: {} + lru.min@1.1.3: {} lucide-react@0.511.0(react@19.2.3): dependencies: @@ -14485,10 +13298,6 @@ snapshots: dependencies: react: 19.2.3 - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -14496,7 +13305,7 @@ snapshots: magicast@0.3.5: dependencies: '@babel/parser': 7.28.5 - '@babel/types': 7.27.7 + '@babel/types': 7.28.5 source-map-js: 1.2.1 make-dir@4.0.0: @@ -14509,9 +13318,9 @@ snapshots: marked-terminal@7.3.0(marked@9.1.6): dependencies: - ansi-escapes: 7.0.0 - ansi-regex: 6.1.0 - chalk: 5.4.1 + ansi-escapes: 7.2.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 cli-highlight: 2.1.11 cli-table3: 0.6.5 marked: 9.1.6 @@ -14526,14 +13335,14 @@ snapshots: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -14655,7 +13464,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 mdast-util-to-hast@13.2.1: dependencies: @@ -14706,7 +13515,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -14823,8 +13632,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -14902,7 +13711,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.1.0 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -14949,8 +13758,8 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.1(supports-color@5.5.0) - decode-named-character-reference: 1.1.0 + debug: 4.4.3(supports-color@5.5.0) + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -14981,7 +13790,7 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -14994,10 +13803,6 @@ snapshots: mimic-response@3.1.0: optional: true - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@10.0.3: dependencies: '@isaacs/brace-expansion': 5.0.0 @@ -15008,45 +13813,35 @@ snapshots: minimatch@3.0.8: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 minimatch@7.4.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} minipass@7.1.2: {} - minizlib@3.0.2: - dependencies: - minipass: 7.1.2 - mkdirp-classic@0.5.3: optional: true mkdirp@2.1.6: {} - mkdirp@3.0.1: {} - - mlly@1.7.4: + mlly@1.8.0: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.1 + ufo: 1.6.2 mri@1.2.0: {} @@ -15054,69 +13849,70 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3): + msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3): dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.12(@types/node@22.17.1) - '@mswjs/interceptors': 0.39.2 + '@inquirer/confirm': 5.1.21(@types/node@22.19.5) + '@mswjs/interceptors': 0.40.0 '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 '@types/statuses': 2.0.6 - graphql: 16.11.0 + cookie: 1.1.1 + graphql: 16.12.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 picocolors: 1.1.1 + rettime: 0.7.0 + statuses: 2.0.2 strict-event-emitter: 0.5.1 - type-fest: 4.41.0 + tough-cookie: 6.0.0 + type-fest: 5.3.1 + until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@types/node' - msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3): + msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3): dependencies: - '@bundled-es-modules/cookie': 2.0.1 - '@bundled-es-modules/statuses': 1.0.1 - '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.12(@types/node@22.19.3) - '@mswjs/interceptors': 0.39.2 + '@inquirer/confirm': 5.1.21(@types/node@25.0.6) + '@mswjs/interceptors': 0.40.0 '@open-draft/deferred-promise': 2.2.0 - '@open-draft/until': 2.1.0 - '@types/cookie': 0.6.0 '@types/statuses': 2.0.6 - graphql: 16.11.0 + cookie: 1.1.1 + graphql: 16.12.0 headers-polyfill: 4.0.3 is-node-process: 1.2.0 outvariant: 1.4.3 path-to-regexp: 6.3.0 picocolors: 1.1.1 + rettime: 0.7.0 + statuses: 2.0.2 strict-event-emitter: 0.5.1 - type-fest: 4.41.0 + tough-cookie: 6.0.0 + type-fest: 5.3.1 + until-async: 3.0.2 yargs: 17.7.2 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@types/node' + optional: true muggle-string@0.4.1: {} mute-stream@2.0.0: {} - mysql2@3.14.1: + mysql2@3.16.0: dependencies: aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.6.3 + iconv-lite: 0.7.2 long: 5.3.2 - lru.min: 1.1.2 - named-placeholders: 1.1.3 + lru.min: 1.1.3 + named-placeholders: 1.1.6 seq-queue: 0.0.5 sqlstring: 2.3.3 @@ -15126,15 +13922,15 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - named-placeholders@1.1.3: + named-placeholders@1.1.6: dependencies: - lru-cache: 7.18.3 + lru.min: 1.1.3 nano-spawn@2.0.0: {} nanoid@3.3.11: {} - nanostores@0.11.4: {} + nanostores@1.1.0: {} napi-build-utils@2.0.0: optional: true @@ -15145,19 +13941,19 @@ snapshots: neverthrow@8.2.0: optionalDependencies: - '@rollup/rollup-linux-x64-gnu': 4.40.2 + '@rollup/rollup-linux-x64-gnu': 4.55.1 - next-auth@4.24.11(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next-auth@4.24.13(next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - '@babel/runtime': 7.27.1 + '@babel/runtime': 7.28.4 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + next: 16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) oauth: 0.9.15 openid-client: 5.7.1 - preact: 10.26.6 - preact-render-to-string: 5.2.6(preact@10.26.6) + preact: 10.28.2 + preact-render-to-string: 5.2.6(preact@10.28.2) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) uuid: 8.3.2 @@ -15169,16 +13965,16 @@ snapshots: next-tick@1.1.0: {} - next@16.1.1(@babel/core@7.27.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + next@16.1.1(@babel/core@7.28.5)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@next/env': 16.1.1 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.9.11 - caniuse-lite: 1.0.30001761 + baseline-browser-mapping: 2.9.14 + caniuse-lite: 1.0.30001764 postcss: 8.4.31 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - styled-jsx: 5.1.6(@babel/core@7.27.7)(react@19.2.3) + styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 16.1.1 '@next/swc-darwin-x64': 16.1.1 @@ -15207,7 +14003,7 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-fetch-native@1.6.6: {} + node-fetch-native@1.6.7: {} node-fetch@3.3.2: dependencies: @@ -15215,16 +14011,16 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-releases@2.0.19: {} + node-releases@2.0.27: {} nodemon@3.1.11: dependencies: chokidar: 3.6.0 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.7.2 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.1 @@ -15243,14 +14039,6 @@ snapshots: npm-to-yarn@3.0.1: {} - nypm@0.6.0: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - pathe: 2.0.3 - pkg-types: 2.3.0 - tinyexec: 0.3.2 - nypm@0.6.2: dependencies: citty: 0.1.6 @@ -15261,7 +14049,7 @@ snapshots: oauth4webapi@2.17.0: {} - oauth4webapi@3.5.1: {} + oauth4webapi@3.8.3: {} oauth@0.9.15: {} @@ -15273,13 +14061,13 @@ snapshots: obug@2.1.1: {} - odata-query@8.0.4: + odata-query@8.0.7: dependencies: tslib: 2.8.1 ohash@2.0.11: {} - oidc-token-hash@5.1.0: {} + oidc-token-hash@5.2.0: {} on-finished@2.4.1: dependencies: @@ -15309,19 +14097,19 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 - open@10.1.2: + open@10.2.0: dependencies: - default-browser: 5.2.1 + default-browser: 5.4.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 - is-wsl: 3.1.0 + wsl-utils: 0.1.0 openid-client@5.7.1: dependencies: jose: 4.15.9 lru-cache: 6.0.0 object-hash: 2.2.0 - oidc-token-hash: 5.1.0 + oidc-token-hash: 5.2.0 ora@6.3.1: dependencies: @@ -15332,41 +14120,46 @@ snapshots: is-unicode-supported: 1.3.0 log-symbols: 5.1.0 stdin-discarder: 0.1.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} - outdent@0.5.0: {} outvariant@1.4.3: {} - oxc-resolver@9.0.2: - optionalDependencies: - '@oxc-resolver/binding-darwin-arm64': 9.0.2 - '@oxc-resolver/binding-darwin-x64': 9.0.2 - '@oxc-resolver/binding-freebsd-x64': 9.0.2 - '@oxc-resolver/binding-linux-arm-gnueabihf': 9.0.2 - '@oxc-resolver/binding-linux-arm64-gnu': 9.0.2 - '@oxc-resolver/binding-linux-arm64-musl': 9.0.2 - '@oxc-resolver/binding-linux-riscv64-gnu': 9.0.2 - '@oxc-resolver/binding-linux-s390x-gnu': 9.0.2 - '@oxc-resolver/binding-linux-x64-gnu': 9.0.2 - '@oxc-resolver/binding-linux-x64-musl': 9.0.2 - '@oxc-resolver/binding-wasm32-wasi': 9.0.2 - '@oxc-resolver/binding-win32-arm64-msvc': 9.0.2 - '@oxc-resolver/binding-win32-x64-msvc': 9.0.2 - - oxlint@1.37.0: - optionalDependencies: - '@oxlint/darwin-arm64': 1.37.0 - '@oxlint/darwin-x64': 1.37.0 - '@oxlint/linux-arm64-gnu': 1.37.0 - '@oxlint/linux-arm64-musl': 1.37.0 - '@oxlint/linux-x64-gnu': 1.37.0 - '@oxlint/linux-x64-musl': 1.37.0 - '@oxlint/win32-arm64': 1.37.0 - '@oxlint/win32-x64': 1.37.0 + oxc-resolver@11.16.2: + optionalDependencies: + '@oxc-resolver/binding-android-arm-eabi': 11.16.2 + '@oxc-resolver/binding-android-arm64': 11.16.2 + '@oxc-resolver/binding-darwin-arm64': 11.16.2 + '@oxc-resolver/binding-darwin-x64': 11.16.2 + '@oxc-resolver/binding-freebsd-x64': 11.16.2 + '@oxc-resolver/binding-linux-arm-gnueabihf': 11.16.2 + '@oxc-resolver/binding-linux-arm-musleabihf': 11.16.2 + '@oxc-resolver/binding-linux-arm64-gnu': 11.16.2 + '@oxc-resolver/binding-linux-arm64-musl': 11.16.2 + '@oxc-resolver/binding-linux-ppc64-gnu': 11.16.2 + '@oxc-resolver/binding-linux-riscv64-gnu': 11.16.2 + '@oxc-resolver/binding-linux-riscv64-musl': 11.16.2 + '@oxc-resolver/binding-linux-s390x-gnu': 11.16.2 + '@oxc-resolver/binding-linux-x64-gnu': 11.16.2 + '@oxc-resolver/binding-linux-x64-musl': 11.16.2 + '@oxc-resolver/binding-openharmony-arm64': 11.16.2 + '@oxc-resolver/binding-wasm32-wasi': 11.16.2 + '@oxc-resolver/binding-win32-arm64-msvc': 11.16.2 + '@oxc-resolver/binding-win32-ia32-msvc': 11.16.2 + '@oxc-resolver/binding-win32-x64-msvc': 11.16.2 + + oxlint@1.39.0: + optionalDependencies: + '@oxlint/darwin-arm64': 1.39.0 + '@oxlint/darwin-x64': 1.39.0 + '@oxlint/linux-arm64-gnu': 1.39.0 + '@oxlint/linux-arm64-musl': 1.39.0 + '@oxlint/linux-x64-gnu': 1.39.0 + '@oxlint/linux-x64-musl': 1.39.0 + '@oxlint/win32-arm64': 1.39.0 + '@oxlint/win32-x64': 1.39.0 p-filter@2.1.0: dependencies: @@ -15392,7 +14185,7 @@ snapshots: package-manager-detector@0.2.11: dependencies: - quansync: 0.2.10 + quansync: 0.2.11 package-manager-detector@1.6.0: {} @@ -15413,7 +14206,7 @@ snapshots: parse-json@5.2.0: dependencies: '@babel/code-frame': 7.27.1 - error-ex: 1.3.2 + error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -15441,20 +14234,13 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: + path-scurry@2.0.1: dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-scurry@2.0.0: - dependencies: - lru-cache: 11.1.0 + lru-cache: 11.2.4 minipass: 7.1.2 path-to-regexp@6.3.0: {} - path-to-regexp@8.2.0: {} - path-to-regexp@8.3.0: {} path-type@4.0.0: {} @@ -15463,32 +14249,30 @@ snapshots: peek-readable@5.4.2: {} - perfect-debounce@1.0.0: {} + perfect-debounce@2.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.6.0: {} pify@4.0.1: {} - pkce-challenge@5.0.0: {} + pkce-challenge@5.0.1: {} pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.4 + mlly: 1.8.0 pathe: 2.0.3 pkg-types@2.3.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.7 + exsolve: 1.0.8 pathe: 2.0.3 postcss-selector-parser@7.1.1: @@ -15508,27 +14292,23 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postgres@3.4.5: {} + postgres@3.4.8: {} - preact-render-to-string@5.2.3(preact@10.11.3): + preact-render-to-string@5.2.3(preact@10.28.2): dependencies: - preact: 10.11.3 + preact: 10.28.2 pretty-format: 3.8.0 - preact-render-to-string@5.2.6(preact@10.26.6): + preact-render-to-string@5.2.6(preact@10.28.2): dependencies: - preact: 10.26.6 + preact: 10.28.2 pretty-format: 3.8.0 - preact-render-to-string@6.5.11(preact@10.24.3): + preact-render-to-string@6.5.11(preact@10.28.2): dependencies: - preact: 10.24.3 - - preact@10.11.3: {} - - preact@10.24.3: {} + preact: 10.28.2 - preact@10.26.6: {} + preact@10.28.2: {} prebuild-install@7.1.3: dependencies: @@ -15558,7 +14338,7 @@ snapshots: pretty-format@3.8.0: {} - pretty-ms@9.2.0: + pretty-ms@9.3.0: dependencies: parse-ms: 4.0.0 @@ -15582,10 +14362,6 @@ snapshots: proxy-from-env@1.1.0: {} - psl@1.15.0: - dependencies: - punycode: 2.3.1 - pstree.remy@1.1.8: {} publint@0.3.16: @@ -15603,24 +14379,14 @@ snapshots: punycode@2.3.1: {} - pvtsutils@1.3.6: - dependencies: - tslib: 2.8.1 - - pvutils@1.1.3: {} - - qs@6.14.0: + qs@6.14.1: dependencies: side-channel: 1.1.0 - quansync@0.2.10: {} - quansync@0.2.11: {} quansync@1.0.0: {} - querystringify@2.2.0: {} - queue-microtask@1.2.3: {} radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): @@ -15696,11 +14462,11 @@ snapshots: range-parser@1.2.1: {} - raw-body@3.0.0: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.6.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 unpipe: 1.0.0 rc9@2.1.2: @@ -15721,7 +14487,7 @@ snapshots: react: 19.2.3 scheduler: 0.27.0 - react-hook-form@7.68.0(react@19.2.3): + react-hook-form@7.71.0(react@19.2.3): dependencies: react: 19.2.3 @@ -15742,7 +14508,7 @@ snapshots: optionalDependencies: '@types/react': 19.2.7 - react-remove-scroll@2.7.1(@types/react@19.2.7)(react@19.2.3): + react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.3): dependencies: react: 19.2.3 react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.3) @@ -15766,7 +14532,7 @@ snapshots: read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 - js-yaml: 3.14.1 + js-yaml: 3.14.2 pify: 4.0.1 strip-bom: 3.0.0 @@ -15798,15 +14564,14 @@ snapshots: estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.0(acorn@8.14.1): + recma-jsx@1.0.1(acorn@8.15.0): dependencies: - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 unified: 11.0.5 - transitivePeerDependencies: - - acorn recma-parse@1.0.0: dependencies: @@ -15896,8 +14661,6 @@ snapshots: require-main-filename@2.0.0: {} - requires-port@1.0.0: {} - reselect@5.1.1: {} resolve-from@4.0.0: {} @@ -15906,7 +14669,7 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.10: + resolve@1.22.11: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 @@ -15922,91 +14685,98 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + rettime@0.7.0: {} + reusify@1.1.0: {} rfdc@1.4.1: {} - rolldown-plugin-dts@0.15.10(rolldown@1.0.0-beta.58)(typescript@5.9.3): + rolldown-plugin-dts@0.15.10(oxc-resolver@11.16.2)(rolldown@1.0.0-beta.59)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 '@babel/types': 7.28.5 ast-kit: 2.2.0 birpc: 2.9.0 - debug: 4.4.1(supports-color@5.5.0) - dts-resolver: 2.1.3 + debug: 4.4.3(supports-color@5.5.0) + dts-resolver: 2.1.3(oxc-resolver@11.16.2) get-tsconfig: 4.13.0 - rolldown: 1.0.0-beta.58 + rolldown: 1.0.0-beta.59 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.58: + rolldown@1.0.0-beta.59: dependencies: - '@oxc-project/types': 0.106.0 - '@rolldown/pluginutils': 1.0.0-beta.58 + '@oxc-project/types': 0.107.0 + '@rolldown/pluginutils': 1.0.0-beta.59 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-x64': 1.0.0-beta.58 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 - - rollup-plugin-preserve-directives@0.4.0(rollup@4.40.2): - dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) + '@rolldown/binding-android-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.59 + '@rolldown/binding-darwin-x64': 1.0.0-beta.59 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.59 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.59 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.59 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.59 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.59 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.59 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.59 + + rollup-plugin-preserve-directives@0.4.0(rollup@4.55.1): + dependencies: + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) magic-string: 0.30.21 - rollup: 4.40.2 + rollup: 4.55.1 - rollup@4.40.2: + rollup@4.55.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.2 - '@rollup/rollup-android-arm64': 4.40.2 - '@rollup/rollup-darwin-arm64': 4.40.2 - '@rollup/rollup-darwin-x64': 4.40.2 - '@rollup/rollup-freebsd-arm64': 4.40.2 - '@rollup/rollup-freebsd-x64': 4.40.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.2 - '@rollup/rollup-linux-arm-musleabihf': 4.40.2 - '@rollup/rollup-linux-arm64-gnu': 4.40.2 - '@rollup/rollup-linux-arm64-musl': 4.40.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-gnu': 4.40.2 - '@rollup/rollup-linux-riscv64-musl': 4.40.2 - '@rollup/rollup-linux-s390x-gnu': 4.40.2 - '@rollup/rollup-linux-x64-gnu': 4.40.2 - '@rollup/rollup-linux-x64-musl': 4.40.2 - '@rollup/rollup-win32-arm64-msvc': 4.40.2 - '@rollup/rollup-win32-ia32-msvc': 4.40.2 - '@rollup/rollup-win32-x64-msvc': 4.40.2 + '@rollup/rollup-android-arm-eabi': 4.55.1 + '@rollup/rollup-android-arm64': 4.55.1 + '@rollup/rollup-darwin-arm64': 4.55.1 + '@rollup/rollup-darwin-x64': 4.55.1 + '@rollup/rollup-freebsd-arm64': 4.55.1 + '@rollup/rollup-freebsd-x64': 4.55.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 + '@rollup/rollup-linux-arm-musleabihf': 4.55.1 + '@rollup/rollup-linux-arm64-gnu': 4.55.1 + '@rollup/rollup-linux-arm64-musl': 4.55.1 + '@rollup/rollup-linux-loong64-gnu': 4.55.1 + '@rollup/rollup-linux-loong64-musl': 4.55.1 + '@rollup/rollup-linux-ppc64-gnu': 4.55.1 + '@rollup/rollup-linux-ppc64-musl': 4.55.1 + '@rollup/rollup-linux-riscv64-gnu': 4.55.1 + '@rollup/rollup-linux-riscv64-musl': 4.55.1 + '@rollup/rollup-linux-s390x-gnu': 4.55.1 + '@rollup/rollup-linux-x64-gnu': 4.55.1 + '@rollup/rollup-linux-x64-musl': 4.55.1 + '@rollup/rollup-openbsd-x64': 4.55.1 + '@rollup/rollup-openharmony-arm64': 4.55.1 + '@rollup/rollup-win32-arm64-msvc': 4.55.1 + '@rollup/rollup-win32-ia32-msvc': 4.55.1 + '@rollup/rollup-win32-x64-gnu': 4.55.1 + '@rollup/rollup-win32-x64-msvc': 4.55.1 fsevents: 2.3.3 - rou3@0.5.1: {} + rou3@0.7.12: {} router@2.2.0: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.2.0 + path-to-regexp: 8.3.0 transitivePeerDependencies: - supports-color - run-applescript@7.0.0: {} + run-applescript@7.1.0: {} run-parallel@1.2.0: dependencies: @@ -16036,19 +14806,17 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.2: {} - semver@7.7.3: {} - send@1.2.0: + send@1.2.1: dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) 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 @@ -16058,70 +14826,38 @@ snapshots: seq-queue@0.0.5: {} - serve-static@2.2.0: + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.0 + send: 1.2.1 transitivePeerDependencies: - supports-color set-blocking@2.0.0: {} - set-cookie-parser@2.7.1: {} + set-cookie-parser@2.7.2: {} setprototypeof@1.2.0: {} - shadcn@2.10.0(@types/node@22.17.1)(typescript@5.9.3): - dependencies: - '@antfu/ni': 23.3.1 - '@babel/core': 7.27.7 - '@babel/parser': 7.28.3 - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.7) - '@modelcontextprotocol/sdk': 1.17.2 - commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.9.3) - deepmerge: 4.3.1 - diff: 5.2.0 - execa: 7.2.0 - fast-glob: 3.3.3 - fs-extra: 11.3.0 - https-proxy-agent: 6.2.1 - kleur: 4.1.5 - msw: 2.10.2(@types/node@22.17.1)(typescript@5.9.3) - node-fetch: 3.3.2 - ora: 6.3.1 - postcss: 8.5.6 - prompts: 2.4.2 - recast: 0.23.11 - stringify-object: 5.0.0 - ts-morph: 18.0.0 - tsconfig-paths: 4.2.0 - zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) - transitivePeerDependencies: - - '@types/node' - - supports-color - - typescript - - shadcn@2.10.0(@types/node@22.19.3)(typescript@5.9.3): + shadcn@2.10.0(@types/node@22.19.5)(hono@4.11.3)(typescript@5.9.3): dependencies: '@antfu/ni': 23.3.1 - '@babel/core': 7.27.7 - '@babel/parser': 7.28.3 - '@babel/plugin-transform-typescript': 7.27.1(@babel/core@7.27.7) - '@modelcontextprotocol/sdk': 1.17.2 + '@babel/core': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.28.5) + '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.3)(zod@3.25.76) commander: 10.0.1 cosmiconfig: 8.3.6(typescript@5.9.3) deepmerge: 4.3.1 diff: 5.2.0 execa: 7.2.0 fast-glob: 3.3.3 - fs-extra: 11.3.0 + fs-extra: 11.3.3 https-proxy-agent: 6.2.1 kleur: 4.1.5 - msw: 2.10.2(@types/node@22.19.3)(typescript@5.9.3) + msw: 2.12.7(@types/node@22.19.5)(typescript@5.9.3) node-fetch: 3.3.2 ora: 6.3.1 postcss: 8.5.6 @@ -16131,9 +14867,11 @@ snapshots: ts-morph: 18.0.0 tsconfig-paths: 4.2.0 zod: 3.25.76 - zod-to-json-schema: 3.24.6(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: + - '@cfworker/json-schema' - '@types/node' + - hono - supports-color - typescript @@ -16234,9 +14972,9 @@ snapshots: simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 - sirv@3.0.1: + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 @@ -16252,10 +14990,10 @@ snapshots: slice-ansi@7.1.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 - smol-toml@1.3.4: {} + smol-toml@1.6.0: {} sonner@2.0.7(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: @@ -16266,14 +15004,14 @@ snapshots: sort-package-json@2.15.1: dependencies: - detect-indent: 7.0.1 + detect-indent: 7.0.2 detect-newline: 4.0.1 get-stdin: 9.0.0 git-hooks-list: 3.2.0 is-plain-obj: 4.1.0 - semver: 7.7.2 + semver: 7.7.3 sort-object-keys: 1.1.3 - tinyglobby: 0.2.13 + tinyglobby: 0.2.15 source-map-js@1.2.1: {} @@ -16284,7 +15022,7 @@ snapshots: source-map@0.6.1: {} - source-map@0.7.4: {} + source-map@0.7.6: {} space-separated-tokens@2.0.2: {} @@ -16305,14 +15043,10 @@ snapshots: stackback@0.0.2: {} - statuses@2.0.1: {} - statuses@2.0.2: {} std-env@3.10.0: {} - std-env@3.9.0: {} - stdin-discarder@0.1.0: dependencies: bl: 5.1.0 @@ -16337,18 +15071,18 @@ snapshots: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@7.2.0: dependencies: emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string-width@8.1.0: dependencies: get-east-asian-width: 1.4.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 string_decoder@1.3.0: dependencies: @@ -16373,9 +15107,9 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + strip-ansi@7.1.2: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.2 strip-bom@3.0.0: {} @@ -16388,33 +15122,33 @@ snapshots: strip-json-comments@3.1.1: {} - strip-json-comments@5.0.1: {} + strip-json-comments@5.0.3: {} - strnum@2.1.1: {} + strnum@2.1.2: {} strtok3@9.1.1: dependencies: '@tokenizer/token': 0.3.0 peek-readable: 5.4.2 - style-to-js@1.1.17: + style-to-js@1.1.21: dependencies: - style-to-object: 1.0.9 + style-to-object: 1.0.14 - style-to-object@1.0.9: + style-to-object@1.0.14: dependencies: - inline-style-parser: 0.2.4 + inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.27.7)(react@19.2.3): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.3): dependencies: client-only: 0.0.1 react: 19.2.3 optionalDependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.28.5 - superjson@2.2.2: + superjson@2.2.6: dependencies: - copy-anything: 3.0.5 + copy-anything: 4.0.5 supports-color@5.5.0: dependencies: @@ -16435,17 +15169,15 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tabbable@6.3.0: {} + tabbable@6.4.0: {} - tailwind-merge@3.3.1: {} + tagged-tag@1.0.0: {} tailwind-merge@3.4.0: {} - tailwindcss@4.1.11: {} - tailwindcss@4.1.18: {} - tapable@2.2.2: {} + tapable@2.3.0: {} tar-fs@2.1.4: dependencies: @@ -16464,21 +15196,12 @@ snapshots: readable-stream: 3.6.2 optional: true - tar@7.4.3: - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.2 - mkdirp: 3.0.1 - yallist: 5.0.0 - term-size@2.2.1: {} test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 + glob: 11.1.0 minimatch: 9.0.5 thenify-all@1.6.0: @@ -16500,22 +15223,8 @@ snapshots: tinycolor2@1.6.0: {} - tinyexec@0.3.2: {} - - tinyexec@1.0.1: {} - tinyexec@1.0.2: {} - tinyglobby@0.2.13: - dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - - tinyglobby@0.2.14: - dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -16532,9 +15241,11 @@ snapshots: tinyrainbow@3.0.3: {} - tmp@0.0.33: + tldts-core@7.0.19: {} + + tldts@7.0.19: dependencies: - os-tmpdir: 1.0.2 + tldts-core: 7.0.19 to-regex-range@5.0.1: dependencies: @@ -16542,8 +15253,9 @@ snapshots: toidentifier@1.0.1: {} - token-types@6.0.0: + token-types@6.1.2: dependencies: + '@borewit/text-codec': 0.2.1 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 @@ -16551,12 +15263,9 @@ snapshots: touch@3.1.1: {} - tough-cookie@4.1.4: + tough-cookie@6.0.0: dependencies: - psl: 1.15.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 + tldts: 7.0.19 tree-kill@1.2.2: {} @@ -16564,7 +15273,7 @@ snapshots: trough@2.2.0: {} - trpc-cli@0.12.1(@trpc/server@11.8.1(typescript@5.9.3))(zod@4.3.5): + trpc-cli@0.12.2(@trpc/server@11.8.1(typescript@5.9.3))(zod@4.3.5): dependencies: commander: 14.0.2 optionalDependencies: @@ -16588,7 +15297,7 @@ snapshots: ts-toolbelt@9.6.0: {} - tsconfck@3.1.5(typescript@5.9.3): + tsconfck@3.1.6(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 @@ -16598,20 +15307,20 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdown@0.14.2(publint@0.3.16)(typescript@5.9.3): + tsdown@0.14.2(oxc-resolver@11.16.2)(publint@0.3.16)(typescript@5.9.3): dependencies: - ansis: 4.1.0 + ansis: 4.2.0 cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.58 - rolldown-plugin-dts: 0.15.10(rolldown@1.0.0-beta.58)(typescript@5.9.3) - semver: 7.7.2 - tinyexec: 1.0.1 - tinyglobby: 0.2.14 + rolldown: 1.0.0-beta.59 + rolldown-plugin-dts: 0.15.10(oxc-resolver@11.16.2)(rolldown@1.0.0-beta.59)(typescript@5.9.3) + semver: 7.7.3 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 tree-kill: 1.2.2 unconfig: 7.4.2 optionalDependencies: @@ -16625,16 +15334,9 @@ snapshots: tslib@2.8.1: {} - tsx@4.20.3: - dependencies: - esbuild: 0.25.8 - get-tsconfig: 4.10.1 - optionalDependencies: - fsevents: 2.3.3 - tsx@4.21.0: dependencies: - esbuild: 0.27.1 + esbuild: 0.27.2 get-tsconfig: 4.13.0 optionalDependencies: fsevents: 2.3.3 @@ -16644,47 +15346,37 @@ snapshots: safe-buffer: 5.2.1 optional: true - turbo-darwin-64@2.5.4: + turbo-darwin-64@2.7.4: optional: true - turbo-darwin-arm64@2.5.4: + turbo-darwin-arm64@2.7.4: optional: true - turbo-linux-64@2.5.4: + turbo-linux-64@2.7.4: optional: true - turbo-linux-arm64@2.5.4: + turbo-linux-arm64@2.7.4: optional: true - turbo-windows-64@2.5.4: + turbo-windows-64@2.7.4: optional: true - turbo-windows-arm64@2.5.4: + turbo-windows-arm64@2.7.4: optional: true - turbo@2.5.4: + turbo@2.7.4: optionalDependencies: - turbo-darwin-64: 2.5.4 - turbo-darwin-arm64: 2.5.4 - turbo-linux-64: 2.5.4 - turbo-linux-arm64: 2.5.4 - turbo-windows-64: 2.5.4 - turbo-windows-arm64: 2.5.4 - - tw-animate-css@1.3.6: {} + turbo-darwin-64: 2.7.4 + turbo-darwin-arm64: 2.7.4 + turbo-linux-64: 2.7.4 + turbo-linux-arm64: 2.7.4 + turbo-windows-64: 2.7.4 + turbo-windows-arm64: 2.7.4 - twoslash-protocol@0.3.4: {} + tw-animate-css@1.4.0: {} twoslash-protocol@0.3.6: {} - twoslash@0.3.4(typescript@5.9.3): - dependencies: - '@typescript/vfs': 1.6.1(typescript@5.9.3) - twoslash-protocol: 0.3.4 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - twoslash@0.3.6(typescript@5.9.3): dependencies: '@typescript/vfs': 1.6.2(typescript@5.9.3) @@ -16693,17 +15385,17 @@ snapshots: transitivePeerDependencies: - supports-color - type-fest@0.21.3: {} - type-fest@3.13.1: {} - type-fest@4.41.0: {} + type-fest@5.3.1: + dependencies: + tagged-tag: 1.0.0 type-is@2.0.1: dependencies: content-type: 1.0.5 media-typer: 1.1.0 - mime-types: 3.0.1 + mime-types: 3.0.2 type@2.7.3: {} @@ -16715,23 +15407,23 @@ snapshots: typescript@5.9.3: {} - ufo@1.6.1: {} + ufo@1.6.2: {} uglify-js@3.19.3: optional: true - uint8array-extras@1.4.0: {} + uint8array-extras@1.5.0: {} ultracite@7.0.8(typescript@5.9.3): dependencies: '@clack/prompts': 0.11.0 '@trpc/server': 11.8.1(typescript@5.9.3) deepmerge: 4.3.1 - glob: 13.0.0 + glob: 11.1.0 jsonc-parser: 3.3.1 nypm: 0.6.2 - oxlint: 1.37.0 - trpc-cli: 0.12.1(@trpc/server@11.8.1(typescript@5.9.3))(zod@4.3.5) + oxlint: 1.39.0 + trpc-cli: 0.12.2(@trpc/server@11.8.1(typescript@5.9.3))(zod@4.3.5) zod: 4.3.5 transitivePeerDependencies: - '@orpc/server' @@ -16760,6 +15452,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + unicode-emoji-modifier-base@1.0.0: {} unicorn-magic@0.3.0: {} @@ -16774,7 +15468,7 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unist-util-is@6.0.0: + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -16795,28 +15489,28 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@6.0.1: + unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 universalify@0.1.2: {} - universalify@0.2.0: {} - universalify@2.0.1: {} unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + until-async@3.0.2: {} + + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -16824,11 +15518,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-parse@1.5.10: - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.3): dependencies: react: 19.2.3 @@ -16868,256 +15557,168 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-dts@4.2.3(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)): - dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.17.1) - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@volar/typescript': 2.4.14 - '@vue/language-core': 2.1.6(typescript@5.9.3) - compare-versions: 6.1.1 - debug: 4.4.1(supports-color@5.5.0) - kolorist: 1.8.0 - local-pkg: 0.5.1 - magic-string: 0.30.21 - typescript: 5.9.3 - optionalDependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) - transitivePeerDependencies: - - '@types/node' - - rollup - - supports-color - - vite-plugin-dts@4.2.3(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.2.3(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.17.1) - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@volar/typescript': 2.4.14 + '@microsoft/api-extractor': 7.47.7(@types/node@22.19.5) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@volar/typescript': 2.4.27 '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.2.3(@types/node@22.19.3)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.2.3(@types/node@25.0.6)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.47.7(@types/node@22.19.3) - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@volar/typescript': 2.4.14 + '@microsoft/api-extractor': 7.47.7(@types/node@25.0.6) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@volar/typescript': 2.4.27 '@vue/language-core': 2.1.6(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 0.5.1 magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@22.17.1)(rollup@4.40.2)(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@22.19.5)(rollup@4.55.1)(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - '@microsoft/api-extractor': 7.55.1(@types/node@22.17.1) - '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - '@volar/typescript': 2.4.14 + '@microsoft/api-extractor': 7.55.2(@types/node@22.19.5) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@volar/typescript': 2.4.27 '@vue/language-core': 2.2.0(typescript@5.9.3) compare-versions: 6.1.1 - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) kolorist: 1.8.0 local-pkg: 1.1.2 - magic-string: 0.30.17 + magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)): + vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-externalize-deps@0.9.0(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - vite-plugin-externalize-deps@0.9.0(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - vite: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)): - dependencies: - debug: 4.4.1(supports-color@5.5.0) - globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.9.3) - optionalDependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - - typescript - - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): - dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.9.3) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)): dependencies: - debug: 4.4.1(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) globrex: 0.1.2 - tsconfck: 3.1.5(typescript@5.9.3) + tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.40.2 - tinyglobby: 0.2.14 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 fsevents: 2.3.3 jiti: 1.21.7 lightningcss: 1.30.2 tsx: 4.21.0 yaml: 2.8.2 - vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2): - dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.6 - rollup: 4.40.2 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 22.17.1 - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.30.2 - tsx: 4.20.3 - yaml: 2.8.2 - - vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.40.2 - tinyglobby: 0.2.14 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.17.1 + '@types/node': 22.19.5 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.21.0 yaml: 2.8.2 - vite@6.3.5(@types/node@22.19.3)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.0.6)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.40.2 - tinyglobby: 0.2.14 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 fsevents: 2.3.3 jiti: 1.21.7 lightningcss: 1.30.2 tsx: 4.21.0 yaml: 2.8.2 - vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): + vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2): dependencies: - esbuild: 0.25.4 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.40.2 - tinyglobby: 0.2.14 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.19.3 + '@types/node': 25.0.6 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): - dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 - es-module-lexer: 1.7.0 - expect-type: 1.2.2 - magic-string: 0.30.21 - obug: 2.1.1 - pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 3.10.0 - tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 - tinyrainbow: 3.0.3 - vite: 6.3.5(@types/node@22.17.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.17.1 - happy-dom: 15.11.7 - transitivePeerDependencies: - - jiti - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - terser - - tsx - - yaml - - vitest@4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.20.3)(yaml@2.8.2): + vitest@4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -17127,11 +15728,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.17.1 - happy-dom: 15.11.7 + '@types/node': 22.19.5 + happy-dom: 20.1.0 transitivePeerDependencies: - jiti - less @@ -17145,17 +15746,17 @@ snapshots: - tsx - yaml - vitest@4.0.15(@types/node@22.17.1)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.17(@types/node@22.19.5)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.10.2(@types/node@22.17.1)(typescript@5.9.3))(vite@6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.12.7(@types/node@22.19.5)(typescript@5.9.3))(vite@6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -17165,11 +15766,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.3.5(@types/node@22.17.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.19.5)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.17.1 - happy-dom: 15.11.7 + '@types/node': 22.19.5 + happy-dom: 20.1.0 transitivePeerDependencies: - jiti - less @@ -17183,17 +15784,17 @@ snapshots: - tsx - yaml - vitest@4.0.15(@types/node@22.19.3)(@vitest/ui@3.2.4)(happy-dom@15.11.7)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.17(@types/node@25.0.6)(@vitest/ui@3.2.4)(happy-dom@20.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(vite@6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(vite@6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -17203,12 +15804,12 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.3.5(@types/node@22.19.3)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.3 - '@vitest/ui': 3.2.4(vitest@4.0.15) - happy-dom: 15.11.7 + '@types/node': 25.0.6 + '@vitest/ui': 3.2.4(vitest@4.0.17) + happy-dom: 20.1.0 transitivePeerDependencies: - jiti - less @@ -17222,17 +15823,17 @@ snapshots: - tsx - yaml - vitest@4.0.15(@types/node@22.19.3)(happy-dom@15.11.7)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.17(@types/node@25.0.6)(happy-dom@20.1.0)(jiti@1.21.7)(lightningcss@1.30.2)(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(tsx@4.21.0)(yaml@2.8.2): dependencies: - '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(msw@2.10.2(@types/node@22.19.3)(typescript@5.9.3))(vite@6.3.5(@types/node@22.19.3)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) - '@vitest/pretty-format': 4.0.15 - '@vitest/runner': 4.0.15 - '@vitest/snapshot': 4.0.15 - '@vitest/spy': 4.0.15 - '@vitest/utils': 4.0.15 + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.12.7(@types/node@25.0.6)(typescript@5.9.3))(vite@6.4.1(@types/node@25.0.6)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 es-module-lexer: 1.7.0 - expect-type: 1.2.2 + expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 @@ -17242,11 +15843,11 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.3.5(@types/node@22.19.3)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.6)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.19.3 - happy-dom: 15.11.7 + '@types/node': 25.0.6 + happy-dom: 20.1.0 transitivePeerDependencies: - jiti - less @@ -17262,7 +15863,7 @@ snapshots: vscode-uri@3.1.0: {} - walk-up-path@3.0.1: {} + walk-up-path@4.0.0: {} wcwidth@1.0.1: dependencies: @@ -17270,8 +15871,6 @@ snapshots: web-streams-polyfill@3.3.3: {} - webidl-conversions@7.0.0: {} - whatwg-mimetype@3.0.0: {} which-module@2.0.1: {} @@ -17307,19 +15906,23 @@ snapshots: wrap-ansi@8.1.0: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 5.1.2 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrap-ansi@9.0.2: dependencies: - ansi-styles: 6.2.1 + ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 wrappy@1.0.2: {} - ws@8.18.2: {} + ws@8.19.0: {} + + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.0 y18n@4.0.3: {} @@ -17329,8 +15932,6 @@ snapshots: yallist@4.0.0: {} - yallist@5.0.0: {} - yaml@2.8.2: {} yargs-parser@13.1.2: @@ -17375,22 +15976,16 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yoctocolors-cjs@2.1.2: {} + yoctocolors-cjs@2.1.3: {} - yoctocolors@2.1.1: {} + yoctocolors@2.1.2: {} - zod-to-json-schema@3.24.6(zod@3.25.76): - dependencies: - zod: 3.25.76 - - zod-validation-error@3.4.1(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 zod@3.25.76: {} - zod@4.2.0: {} - zod@4.3.5: {} zwitch@2.0.4: {} diff --git a/scripts/afk-ralph.sh b/scripts/afk-ralph.sh new file mode 100755 index 00000000..1facde9b --- /dev/null +++ b/scripts/afk-ralph.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -e + +if [ -z "$1" ]; then + echo "Usage: $0 " + exit 1 +fi + +for ((i=1; i<=$1; i++)); do + result=$(claude --permission-mode acceptEdits -p "\ + 1. Run 'bd ready' to find available work. \ + 2. If no tasks available, output COMPLETE and stop. \ + 3. Pick ONE task and run 'bd update --status=in_progress'. \ + 4. Run 'bd show ' to understand the task. \ + 5. Implement the task. \ + 6. Run `pnpm ci` at the root to check tests, linters, and other quality gates. \ + 7. Run 'bd close '. \ + 8. Use the graphite CLI to create a new branch with the name of the task and commit the changes. \ + 9. Run 'bd sync'. \ + STOP AFTER ONE TASK.") + + echo "$result" + + if [[ "$result" == *"COMPLETE"* ]]; then + echo "All tasks complete after $i iterations." + exit 0 + fi +done \ No newline at end of file diff --git a/scripts/ralph-once.sh b/scripts/ralph-once.sh new file mode 100755 index 00000000..0bb51408 --- /dev/null +++ b/scripts/ralph-once.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +claude --dangerously-skip-permissions "\ +1. Run 'bv --robot-triage' to find available work. \ +2. Pick ONE task and run 'bd update --status=in_progress'. \ +3. Run 'bd show ' to understand the task. \ +4. Implement the task. \ +5. Run `pnpm ci` at the root to check tests, type checks, and other quality gates. \ +6. Run 'bd close '. \ +7. Use the graphite CLI to create a new branch with the name of the task and commit the changes. \ +8. Run 'bd sync --from-main'. \ +STOP AFTER ONE TASK." \ No newline at end of file diff --git a/turbo.json b/turbo.json index 4f7784de..9ec3de67 100644 --- a/turbo.json +++ b/turbo.json @@ -18,8 +18,37 @@ "dependsOn": ["^build"] }, "test": { - "outputs": ["coverage/**"], - "dependsOn": [] + "inputs": [ + "$TURBO_DEFAULT$", + "vitest.config.*", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.spec.ts", + "**/*.spec.tsx" + ], + "outputs": [], + "dependsOn": ["^build"] + }, + "test:e2e": { + "inputs": [ + "$TURBO_DEFAULT$", + "vitest.config.*", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.spec.ts", + "**/*.spec.tsx" + ], + "outputs": [], + "dependsOn": ["^build"], + "cache": false + }, + "test:watch": { + "cache": false, + "persistent": true + }, + "typecheck": { + "dependsOn": ["^build"], + "outputs": [] }, "lint": {}, "dev": {