From 19466c1566b0f6c7faf2a02b0b7468e56a9f9cb7 Mon Sep 17 00:00:00 2001 From: Mohammed Obaid Date: Wed, 28 Oct 2026 13:59:11 +0530 Subject: [PATCH 1/2] feat(compute): add room-booking-prisma-template community template Next.js room booking app on a Resource Scheduler timeline, with Prisma ORM 8, Prisma Postgres and Prisma Compute. Adds the template folder, its templates.json entry and a row in compute/README.md. --- compute/README.md | 1 + .../room-booking-prisma-template/.env.example | 14 + .../.gitattributes | 6 + .../.github/workflows/prisma-deploy.yml | 40 + .../room-booking-prisma-template/.gitignore | 35 + compute/room-booking-prisma-template/.nvmrc | 1 + .../room-booking-prisma-template/AGENTS.md | 21 + compute/room-booking-prisma-template/LICENSE | 21 + .../room-booking-prisma-template/README.md | 211 + .../docs/screenshot-dark.png | Bin 0 -> 97811 bytes .../docs/screenshot-light.png | Bin 0 -> 98769 bytes .../eslint.config.mjs | 19 + .../app/20261026T1925_init/migration.json | 7 + .../app/20261026T1925_init/migration.ts | 120 + .../app/20261026T1925_init/ops.json | 301 + .../contract.d.ts | 616 + .../contract.json | 1 + .../room-booking-prisma-template/module.ts | 18 + .../next.config.ts | 14 + .../package-lock.json | 13634 ++++++++++++++++ .../room-booking-prisma-template/package.json | 58 + .../prisma.config.ts | 32 + .../room-booking-prisma-template/service.ts | 13 + .../src/app/about.tsx | 101 + .../src/app/api/bookings/[id]/route.ts | 37 + .../src/app/api/bookings/route.ts | 40 + .../src/app/board.tsx | 313 + .../src/app/booking-dialog.tsx | 142 + .../src/app/globals.css | 734 + .../src/app/icon.svg | 1 + .../src/app/layout.tsx | 30 + .../src/app/page.tsx | 82 + .../src/app/room-status.tsx | 91 + .../src/lib/api-client.ts | 50 + .../src/lib/api-types.ts | 45 + .../src/lib/office.ts | 41 + .../src/lib/rules.ts | 63 + .../src/lib/validation.ts | 62 + .../src/prisma/composer.ts | 6 + .../src/prisma/contract.d.ts | 656 + .../src/prisma/contract.json | 400 + .../src/prisma/contract.prisma | 27 + .../src/prisma/db.ts | 40 + .../src/prisma/seed-cli.ts | 17 + .../src/prisma/seed.ts | 77 + .../src/server/bookings.ts | 164 + .../src/server/http.ts | 30 + .../tests/bookings.integration.test.ts | 203 + .../tests/global-setup.ts | 16 + .../tests/rules.test.ts | 88 + .../tests/validation.test.ts | 73 + .../tsconfig.json | 46 + .../vitest.config.ts | 12 + compute/templates.json | 8 + 54 files changed, 18878 insertions(+) create mode 100644 compute/room-booking-prisma-template/.env.example create mode 100644 compute/room-booking-prisma-template/.gitattributes create mode 100644 compute/room-booking-prisma-template/.github/workflows/prisma-deploy.yml create mode 100644 compute/room-booking-prisma-template/.gitignore create mode 100644 compute/room-booking-prisma-template/.nvmrc create mode 100644 compute/room-booking-prisma-template/AGENTS.md create mode 100644 compute/room-booking-prisma-template/LICENSE create mode 100644 compute/room-booking-prisma-template/README.md create mode 100644 compute/room-booking-prisma-template/docs/screenshot-dark.png create mode 100644 compute/room-booking-prisma-template/docs/screenshot-light.png create mode 100644 compute/room-booking-prisma-template/eslint.config.mjs create mode 100644 compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.json create mode 100644 compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.ts create mode 100644 compute/room-booking-prisma-template/migrations/app/20261026T1925_init/ops.json create mode 100644 compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.d.ts create mode 100644 compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.json create mode 100644 compute/room-booking-prisma-template/module.ts create mode 100644 compute/room-booking-prisma-template/next.config.ts create mode 100644 compute/room-booking-prisma-template/package-lock.json create mode 100644 compute/room-booking-prisma-template/package.json create mode 100644 compute/room-booking-prisma-template/prisma.config.ts create mode 100644 compute/room-booking-prisma-template/service.ts create mode 100644 compute/room-booking-prisma-template/src/app/about.tsx create mode 100644 compute/room-booking-prisma-template/src/app/api/bookings/[id]/route.ts create mode 100644 compute/room-booking-prisma-template/src/app/api/bookings/route.ts create mode 100644 compute/room-booking-prisma-template/src/app/board.tsx create mode 100644 compute/room-booking-prisma-template/src/app/booking-dialog.tsx create mode 100644 compute/room-booking-prisma-template/src/app/globals.css create mode 100644 compute/room-booking-prisma-template/src/app/icon.svg create mode 100644 compute/room-booking-prisma-template/src/app/layout.tsx create mode 100644 compute/room-booking-prisma-template/src/app/page.tsx create mode 100644 compute/room-booking-prisma-template/src/app/room-status.tsx create mode 100644 compute/room-booking-prisma-template/src/lib/api-client.ts create mode 100644 compute/room-booking-prisma-template/src/lib/api-types.ts create mode 100644 compute/room-booking-prisma-template/src/lib/office.ts create mode 100644 compute/room-booking-prisma-template/src/lib/rules.ts create mode 100644 compute/room-booking-prisma-template/src/lib/validation.ts create mode 100644 compute/room-booking-prisma-template/src/prisma/composer.ts create mode 100644 compute/room-booking-prisma-template/src/prisma/contract.d.ts create mode 100644 compute/room-booking-prisma-template/src/prisma/contract.json create mode 100644 compute/room-booking-prisma-template/src/prisma/contract.prisma create mode 100644 compute/room-booking-prisma-template/src/prisma/db.ts create mode 100644 compute/room-booking-prisma-template/src/prisma/seed-cli.ts create mode 100644 compute/room-booking-prisma-template/src/prisma/seed.ts create mode 100644 compute/room-booking-prisma-template/src/server/bookings.ts create mode 100644 compute/room-booking-prisma-template/src/server/http.ts create mode 100644 compute/room-booking-prisma-template/tests/bookings.integration.test.ts create mode 100644 compute/room-booking-prisma-template/tests/global-setup.ts create mode 100644 compute/room-booking-prisma-template/tests/rules.test.ts create mode 100644 compute/room-booking-prisma-template/tests/validation.test.ts create mode 100644 compute/room-booking-prisma-template/tsconfig.json create mode 100644 compute/room-booking-prisma-template/vitest.config.ts diff --git a/compute/README.md b/compute/README.md index 6e14fd2c34b5..6d0e65706d22 100644 --- a/compute/README.md +++ b/compute/README.md @@ -9,6 +9,7 @@ Composer. | [`nextjs`](./nextjs) | Next.js App Router app using standalone output for Prisma Compute. | | [`tanstack-start`](./tanstack-start) | TanStack Start app using the Nitro Vite plugin output supported by Prisma Compute. | | [`personal-site`](./personal-site) | Astro personal site with no database. | +| [`room-booking-prisma-template`](./room-booking-prisma-template) | Next.js room booking app: Resource Scheduler timeline, row locks and an exclusion constraint against double booking. | Each example includes a Composer module and a GitHub Actions deployment workflow. The database-backed examples also include a Prisma 8 contract, diff --git a/compute/room-booking-prisma-template/.env.example b/compute/room-booking-prisma-template/.env.example new file mode 100644 index 000000000000..754b95f44309 --- /dev/null +++ b/compute/room-booking-prisma-template/.env.example @@ -0,0 +1,14 @@ +# Local settings for `npm run dev`, the db:* scripts and the tests. +# Copy this file to .env.local (not .env: `next build` copies .env into the +# bundle that `npm run deploy` uploads) and fill in your own values. +# +# Not needed for `npm run dev:composer`, which starts its own local database, +# or on Prisma Compute, where the app gets its database from Composer. + +# Any PostgreSQL 15+ database. For a free temporary Prisma Postgres database, +# run `npx create-db@latest` and paste the connection string it prints. +DATABASE_URL="postgresql://postgres:postgres@localhost:5432/rooms" + +# Optional: a separate, disposable database for the integration tests +# (`npm test`). They delete its data. Use a real PostgreSQL server here. +# TEST_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/rooms_test" diff --git a/compute/room-booking-prisma-template/.gitattributes b/compute/room-booking-prisma-template/.gitattributes new file mode 100644 index 000000000000..9e87f96ea596 --- /dev/null +++ b/compute/room-booking-prisma-template/.gitattributes @@ -0,0 +1,6 @@ +src/prisma/contract.json linguist-generated +src/prisma/contract.d.ts linguist-generated +src/prisma/ops.json linguist-generated +src/prisma/migration.json linguist-generated +migrations/snapshots/**/contract.json linguist-generated +migrations/snapshots/**/contract.d.ts linguist-generated diff --git a/compute/room-booking-prisma-template/.github/workflows/prisma-deploy.yml b/compute/room-booking-prisma-template/.github/workflows/prisma-deploy.yml new file mode 100644 index 000000000000..9476d5204cda --- /dev/null +++ b/compute/room-booking-prisma-template/.github/workflows/prisma-deploy.yml @@ -0,0 +1,40 @@ +name: prisma-deploy + +on: + push: + delete: + +concurrency: + group: prisma-deploy-${{ github.event_name == 'delete' && github.event.ref || github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + id-token: write + pull-requests: write + +jobs: + deploy: + if: github.event_name == 'push' && github.ref_type == 'branch' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.4.0 + - uses: oven-sh/setup-bun@v2.2.0 + - uses: actions/setup-node@v4.4.0 + with: + node-version-file: .nvmrc + - uses: prisma/cloud-deploy-action@v1.6.0 + + teardown: + if: github.event_name == 'delete' && github.event.ref_type == 'branch' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.4.0 + - uses: oven-sh/setup-bun@v2.2.0 + - uses: actions/setup-node@v4.4.0 + with: + node-version-file: .nvmrc + - uses: prisma/cloud-deploy-action@v1.6.0 + with: + mode: destroy + stage: ${{ github.event.ref }} diff --git a/compute/room-booking-prisma-template/.gitignore b/compute/room-booking-prisma-template/.gitignore new file mode 100644 index 000000000000..9877d5e8175e --- /dev/null +++ b/compute/room-booking-prisma-template/.gitignore @@ -0,0 +1,35 @@ +# dependencies +node_modules/ + +# Next.js +/.next/ +/out/ +next-env.d.ts +*.tsbuildinfo + +# build output +dist/ +/build/ +/coverage/ + +# env files: commit .env.example only +.env +.env*.local + +# Prisma Composer and its deploy engine +/.alchemy +/.prisma-composer +/.prisma + +# misc +.DS_Store +*.pem +npm-debug.log* + +# local AI assistant files +.claude/ +CLAUDE.md +CLAUDE.local.md + +# local browser-automation output +.playwright-mcp/ diff --git a/compute/room-booking-prisma-template/.nvmrc b/compute/room-booking-prisma-template/.nvmrc new file mode 100644 index 000000000000..a45fd52cc589 --- /dev/null +++ b/compute/room-booking-prisma-template/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/compute/room-booking-prisma-template/AGENTS.md b/compute/room-booking-prisma-template/AGENTS.md new file mode 100644 index 000000000000..e87c9c07111e --- /dev/null +++ b/compute/room-booking-prisma-template/AGENTS.md @@ -0,0 +1,21 @@ + + +## This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + + + +## This project + +A room booking template: Next.js 16 App Router, Resource Scheduler (from npm), Prisma ORM 8, Prisma Postgres, Prisma Compute via Prisma Composer. See README.md. + +- Node.js 24 (`.nvmrc`), the version the template is tested on; the Prisma CLI needs 22.18+. Bun must be installed for `npm run dev:composer`, and it does not run on Windows (`prisma dev` returns `DEV.PLATFORM_UNSUPPORTED`): use macOS, Linux, WSL or a Linux container. `prisma dev` runs in the foreground (Ctrl+C stops it); there is no `prisma dev stop`. +- Deploy is `npm run deploy` (`next build`, then `prisma deploy module.ts`). There is no `prisma.compute.ts`, `defineComputeConfig` or `compute:deploy`: that flow was removed. Do not add them. A deploy without `--stage` is production; ask first. `npx prisma auth login` needs a person at a browser. +- Booking rules live in one place, `src/lib/rules.ts`, used by the browser (``) and the server (`isPlacementAllowed` in `src/server/bookings.ts`). Keep them independent of the machine's time zone (`utcToZoned(date, OFFICE_TIME_ZONE)`). +- Every booking write locks the room row(s) inside `db.transaction` before checking; keep the lock order (booking, then rooms sorted by id). Prisma ORM 8 has no isolation-level option. +- Schema changes: edit `src/prisma/contract.prisma`, `npm run contract:emit`, `npm run migration:plan -- --name `, `npm run db:migrate`. Never hand-edit `ops.json`; edit `migration.ts` and run it with `node` to recompile. +- Local settings go in `.env.local`, never `.env` (`next build` copies `.env` into the deployed bundle). +- Before committing: `npm run lint`, `npm run typecheck`, `npm test` (with `TEST_DATABASE_URL` for the PostgreSQL tests), `npm run build`. diff --git a/compute/room-booking-prisma-template/LICENSE b/compute/room-booking-prisma-template/LICENSE new file mode 100644 index 000000000000..24d519343e80 --- /dev/null +++ b/compute/room-booking-prisma-template/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Mohammed Obaid + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/compute/room-booking-prisma-template/README.md b/compute/room-booking-prisma-template/README.md new file mode 100644 index 000000000000..9c4cf6245bc9 --- /dev/null +++ b/compute/room-booking-prisma-template/README.md @@ -0,0 +1,211 @@ +# Room booking with Resource Scheduler and Prisma + +Book meeting rooms on a timeline, and never book the same room twice. A +production-ready starter built end to end on the Prisma platform: + +- **[Resource Scheduler](https://www.npmjs.com/package/resource-scheduler)** for the room timeline: drag to book, move and resize, with a red footprint before you drop on a taken slot. +- **[Prisma ORM](https://www.prisma.io/orm)** 8 for typed queries and migrations. +- **[Prisma Postgres](https://www.prisma.io/postgres)** for the data, with a database per deploy, preview and laptop. +- **[Prisma Compute](https://www.prisma.io/compute)** to host it, declared with Prisma Composer. + +Deploy with Prisma + + + + Six room plates saying which rooms are free right now, above a timeline of the day's bookings colored by floor + + + + +## What it does + +- A plate per room, like the sign by a meeting room door, says whether it is free right now and until when. **Book now** takes the current half hour. +- Rooms are rows, half hours from 08:00 to 18:00 are columns, grouped by floor. Each floor has a color, on its plates and its bookings, and every room shows how much of its day is booked. +- Drag across free time and your own booking form opens (`onSlotSelect`). Drag a booking to move it, drag its edge to resize it, click it to cancel it. +- A taken slot, a time outside opening hours, or one that has already started turns red before you drop (`eventOverlap`, `isValidDrop`), so most mistakes never reach the server. +- The server checks again inside a transaction, with the same rules, so two people booking the same slot at the same moment cannot both win. The loser's change rolls back on screen with a message that says what is in the way. +- Times are shown and checked on the office's clock (`Europe/Berlin` by default), whatever zone the visitor or the server is in. +- An empty database gets six demo rooms and a day of bookings on the first visit. + +## How double booking is prevented + +```text +browser server (route handler) PostgreSQL +─────── ────────────────────── ────────── +bookingRules() on zod validation (400) + red footprint, no request db.transaction(async (tx) => { + lock the room row ─────────────▶ SELECT ... FOR NO KEY UPDATE +optimistic update read overlapping bookings + ◀── 201, or 409/422 + message isPlacementAllowed(..., bookingRules()) (resource-scheduler/headless) + roll back on error insert or update ─────────────▶ EXCLUDE USING gist (backstop) + }) +``` + +1. **The browser** spreads the shared `bookingRules()` (`src/lib/rules.ts`) onto ``, so a refused place is red before the drop. +2. **The server** validates the body with the same zod schemas, then runs one transaction that locks the room's row, re-reads its bookings and asks `isPlacementAllowed` from `resource-scheduler/headless` with the same rules. Everyone writing to that room waits for the lock, so check-then-write cannot race (`src/server/bookings.ts`). +3. **Postgres** refuses overlapping bookings of one room on its own, with an exclusion constraint added in the first migration. With the lock in place it never fires; it guards against writes that skip the app. + +The tests prove each layer separately, including a race where 25 requests book the same slot at once and exactly one succeeds. + +## Run it locally + +You need **Node.js 24** (`.nvmrc`, the version this template is tested on; the Prisma CLI itself needs 22.18 or newer) and **[Bun](https://bun.sh)**, because Prisma Compute runs your app on Bun and so does its local emulator. + +The local emulator runs on macOS and Linux only: `prisma dev` stops on Windows with `local dev is not supported on Windows yet`. On Windows, run it in WSL or a Linux container, or use [hot reload with your own database](#with-hot-reload-and-your-own-database) below. + +```bash +npm install +npm run dev:composer +``` + +Open . This builds the app and runs it the way Prisma Compute does: on Bun, against a local Prisma Postgres database that gets the committed migrations, with no connection string and no account. It runs in the foreground; stop it with Ctrl+C. + +### With hot reload and your own database + +```bash +cp .env.example .env.local # then set DATABASE_URL +npm run db:migrate # apply the migrations +npm run dev # http://localhost:3000, seeds demo data on first visit +``` + +No database at hand? `npx create-db@latest` creates a temporary Prisma Postgres database and prints its connection string. Or run PostgreSQL in Docker: + +```bash +docker run -d --name rooms-db -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:17 +``` + +Use `.env.local`, not `.env`: `next build` copies `.env` into the bundle that a deploy uploads. + +## Deploy to Prisma Compute + +The **Deploy with Prisma** button above copies this repository to your GitHub account and deploys the copy with its own database. If the copy's first `prisma-deploy` run is green but deploys nothing, see [Troubleshooting](#troubleshooting). + +To deploy your own clone, connect it to a Prisma project once, then push. The included `prisma-deploy` workflow (`.github/workflows/prisma-deploy.yml`) deploys every push: the default branch to production, any other branch to a preview named after it. + +```bash +npx prisma auth login # once; opens the browser +npm run deploy # first deploy: creates the project +npx prisma project link room-booking-prisma-template # point this folder at that project +npx prisma git connect # connect this repository (its origin remote) +git push # from now on, GitHub Actions deploys +``` + +`git connect` installs the Prisma GitHub App on the repository if needed, and needs an interactive terminal. Importing the repository in the [Prisma Console](https://console.prisma.io) instead creates the project and connects it in one step. + +A deploy creates the Prisma project (named after the module in `module.ts`) if it does not exist, provisions a Prisma Postgres database, applies the migrations in `migrations/`, deploys the app and prints its URL; on GitHub, the URL is in the workflow run's log. The first visit seeds the demo data. Later deploys apply only what changed. + +- **Region:** the first deploy creates the project in `us-east-1`. To use another region, change `prismaCloud({ region })` in `prisma.config.ts` **before** the first deploy; it cannot change later. +- **Previews:** push a branch to get an isolated copy with its own empty database; deleting the branch removes it. Without GitHub: `npm run build && npx prisma deploy module.ts --stage my-branch`. +- **Without a push:** `npm run deploy` ships the current checkout to production from your machine. +- **Logs and rollback:** `npx prisma service logs app` or `npx prisma service version rollback app --to --confirm `, from a folder linked with `npx prisma project link room-booking-prisma-template`. + +There is no `prisma.compute.ts` or `compute:deploy` script. That was the Prisma Compute setup before Prisma Composer; it was removed in favour of `module.ts`, `service.ts` and the `composer` section of `prisma.config.ts`. + +## Environment variables + +| Variable | Where | What for | +| --- | --- | --- | +| `DATABASE_URL` | `.env.local`, local only | The database for `npm run dev`, `npm run db:*`. Not used on Prisma Compute, where the app gets its database from Composer (`service.load()`). | +| `TEST_DATABASE_URL` | shell or `.env.local` | A disposable PostgreSQL database for the integration tests. | +| `PRISMA_SERVICE_TOKEN`, `PRISMA_WORKSPACE_ID` | CI secrets only | To run `prisma deploy` in CI without a connected repository: another CI system, or the `prisma-deploy` workflow before the repository is connected (see Troubleshooting). | + +**Host and port:** the app needs no settings. Prisma Compute sets `PORT`, and the Next.js standalone server it runs listens on `PORT` and on `HOSTNAME`, which defaults to `0.0.0.0` (all interfaces), as Compute requires. Do not add `HOSTNAME` or `HOST` to the project's environment variables: a server bound to `localhost` deploys fine but cannot be reached. + +## Scripts + +| Script | What it does | +| --- | --- | +| `npm run dev` | Next.js dev server against `DATABASE_URL`. | +| `npm run dev:composer` | Builds, then runs the whole app locally the way Prisma Compute does. | +| `npm run deploy` | Builds, then deploys to Prisma Compute. | +| `npm run db:migrate` | Applies the committed migrations to `DATABASE_URL`. | +| `npm run db:seed` | Adds the demo rooms and bookings if there are no rooms. `npm run db:seed -- --reset` deletes everything first. | +| `npm run contract:emit` | Regenerates `src/prisma/contract.json` and `contract.d.ts` after a change to `contract.prisma`. | +| `npm run migration:plan -- --name ` | Writes a migration for the change. | +| `npm run db:verify` | Checks the database against the contract. | +| `npm test` | Unit tests; with `TEST_DATABASE_URL` also the PostgreSQL integration tests. | +| `npm run lint`, `npm run typecheck` | ESLint and TypeScript. | + +## Project structure + +```text +module.ts the Composer app: a Prisma Postgres database and the Next.js service +service.ts the service: the nextjs build adapter and the database dependency +prisma.config.ts Prisma ORM (contract, connection) and Composer (region, build) config +next.config.ts output: "standalone", which Prisma Compute runs +migrations/ planned migrations, applied by every deploy (init adds the exclusion constraint) +src/ + app/ + page.tsx server component: rooms and the day's bookings, seeds an empty database + board.tsx client component: , optimistic updates and rollback + booking-dialog.tsx the booking form opened by onSlotSelect + api/bookings/route.ts GET (a date range) and POST + api/bookings/[id]/route.ts PATCH (move, resize) and DELETE + lib/ shared by browser and server + office.ts office time zone, opening hours, slot length + rules.ts bookingRules(): the placement rules both sides run + validation.ts zod schemas for every request + api-types.ts, api-client.ts what crosses the network + server/ + bookings.ts the transaction, the room lock and isPlacementAllowed + http.ts error responses: 400, 404, 409, 422 + prisma/ + contract.prisma the schema: Room, Booking + db.ts the Prisma ORM client (Composer's on Compute, DATABASE_URL elsewhere) + seed.ts, seed-cli.ts demo data +tests/ Vitest: rules, validation, and conflicts against PostgreSQL +``` + +## Tests + +```bash +npm test +``` + +runs the unit tests (rules, time zones, validation). The integration tests need a real, disposable PostgreSQL database, because they are about what two connections do at the same time (the local `prisma dev` database shares one session between connections, so it cannot show that): + +```bash +docker run -d --name rooms-test -p 5433:5432 -e POSTGRES_PASSWORD=postgres postgres:17 +TEST_DATABASE_URL="postgresql://postgres:postgres@localhost:5433/postgres" npm test +``` + +They apply the migrations, then check create, move and cancel, 25 simultaneous bookings of one slot (exactly one wins), a create and a move racing, bookings swapping rooms without deadlocks, the room lock alone (constraint dropped), the constraint alone, and concurrent seeding. + +## Make it yours + +- **Your office:** set `OFFICE_TIME_ZONE`, `OPEN_HOUR`, `CLOSE_HOUR` and `SLOT_MINUTES` in `src/lib/office.ts`. The grid, the red footprint and the server follow. +- **Your rooms:** edit the demo data in `src/prisma/seed.ts` (then `npm run db:seed -- --reset` locally), or insert rows into `Room` with any PostgreSQL client. +- **A new rule** (a maximum length, a room only some people may book, no weekends): add it to `checkBookingRules` in `src/lib/rules.ts` with a message in `describeViolation`. The browser shows it as a red footprint and the server enforces it. Keep rules independent of the machine's time zone: read times with `utcToZoned(date, OFFICE_TIME_ZONE)`, never `date.getHours()`. +- **A new field** (attendees, a description): add it to `src/prisma/contract.prisma`, run `npm run contract:emit`, `npm run migration:plan -- --name ` and `npm run db:migrate`, then add it to `src/lib/validation.ts`, the API types and the dialog. The next deploy applies the migration. +- **Sign-in:** there is none in v1, so anyone who can reach the app can book, move and cancel anything. Add authentication (for example [Auth.js](https://www.prisma.io/docs/guides/authentication/authjs/nextjs) or [Better Auth](https://www.prisma.io/docs/guides/authentication/better-auth/nextjs)), check the user in each route handler under `src/app/api/bookings/`, store the owner on `Booking`, and let people change only their own bookings. +- **Recurring bookings:** Resource Scheduler expands a `recurrence` on an event; store the rule next to the booking and check occurrences with `expandEvents` on the server. See [Recurring events](https://resource-scheduler-docs.vercel.app/guides/recurring-events/). +- **Several offices:** give `Room` a time zone and pass it to the rules and the `timeZone` prop per office. + +## Troubleshooting + +- **`alchemy: node is not supported (module.registerHooks needs node 22.15+, 23.5+, or 24+)`** from `npm run dev:composer` or `npm run deploy`: switch to Node 24 (`nvm use`, the repository has an `.nvmrc`). +- **`local dev is not supported on Windows yet`** (`DEV.PLATFORM_UNSUPPORTED`) from `npm run dev:composer`: Prisma's local emulator does not run on Windows. Run it in WSL or a Linux container, or use `npm run dev` with a `DATABASE_URL`. +- **The `prisma-deploy` run is green but nothing deployed** (its log shows `skipped-no-credential` and "This repository is not connected to a Prisma workspace"): the repository is not connected to a Prisma project, so the workflow gets no credential. Copies made with the Deploy button currently end up like this. Connect the repository as in [Deploy to Prisma Compute](#deploy-to-prisma-compute) and push again, or deploy with a service token: create one in the Prisma Console, add it and the workspace ID (from the workspace settings) as the Actions secrets `PRISMA_SERVICE_TOKEN` and `PRISMA_WORKSPACE_ID`, pass them to the deploy step in `.github/workflows/prisma-deploy.yml`, and push: + + ```yaml + - uses: prisma/cloud-deploy-action@v1 + with: + build-command: npm run build + env: + PRISMA_SERVICE_TOKEN: ${{ secrets.PRISMA_SERVICE_TOKEN }} + PRISMA_WORKSPACE_ID: ${{ secrets.PRISMA_WORKSPACE_ID }} + ``` + + The token can deploy anything in the workspace, so keep it in secrets only. Once that deploy has created the project, `npx prisma project link room-booking-prisma-template` and `npx prisma git connect` switch the workflow to deploys without a token; then remove the `env:` lines and the two secrets. +- **The deployed URL answers 504:** `next.config.ts` must keep `output: "standalone"`. +- **`HostedStateBootstrapError` on deploy:** a project with the module's name already exists in your workspace and was created from another checkout. Rename the module in `module.ts`, or deploy with `--name `. +- **The integration tests are skipped:** set `TEST_DATABASE_URL` (see Tests). + +## Learn more + +- [Resource Scheduler docs](https://resource-scheduler-docs.vercel.app/) and the tutorials this template grew from: [React room booking calendar](https://resource-scheduler-docs.vercel.app/tutorials/react-room-booking-calendar/) and [Room booking app with Next.js and Prisma](https://resource-scheduler-docs.vercel.app/tutorials/react-room-booking-nextjs-prisma/) +- [Prisma Compute](https://www.prisma.io/docs/compute), [Prisma Composer](https://www.prisma.io/docs/composer), [Prisma ORM](https://www.prisma.io/docs/orm), [Prisma Postgres](https://www.prisma.io/docs/postgres) + +## License + +[MIT](LICENSE) diff --git a/compute/room-booking-prisma-template/docs/screenshot-dark.png b/compute/room-booking-prisma-template/docs/screenshot-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7faf6a6c1466c4b7cf43fdef823d05788f0543 GIT binary patch literal 97811 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�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
pA|mpM?KkOb$-v_R=!bF))?TR%Ftn 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 YguC$$DI)n=?5YO^S(TSa>35(07Y|Y#lmGw# literal 0 HcmV?d00001 diff --git a/compute/room-booking-prisma-template/eslint.config.mjs b/compute/room-booking-prisma-template/eslint.config.mjs new file mode 100644 index 000000000000..f149fb4a7100 --- /dev/null +++ b/compute/room-booking-prisma-template/eslint.config.mjs @@ -0,0 +1,19 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + globalIgnores([ + ".next/**", + ".prisma-composer/**", + "out/**", + "build/**", + "migrations/**", + "src/prisma/**/*.d.ts", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.json b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.json new file mode 100644 index 000000000000..e83b25fd0c72 --- /dev/null +++ b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.json @@ -0,0 +1,7 @@ +{ + "from": null, + "to": "dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2", + "providedInvariants": [], + "createdAt": "2026-10-26T19:25:48.187Z", + "migrationHash": "b986d5db7f21a14a6b59ba646b71cf2de535ffa6db6725bc6b0f5a9ef334d5cc" +} \ No newline at end of file diff --git a/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.ts b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.ts new file mode 100644 index 000000000000..5df0e6559285 --- /dev/null +++ b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/migration.ts @@ -0,0 +1,120 @@ +#!/usr/bin/env -S node +import type { Contract as End } from '../../snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract'; +import endContract from '../../snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.json' with { type: 'json' }; +import { + Migration, + MigrationCLI, + checkExpression, + col, + createExtension, + fn, + primaryKey, + rawSql, +} from '@prisma/orm-postgres/migration'; + +export default class M extends Migration { + override readonly endContractJson = endContract; + + override get operations() { + return [ + // Needed by the exclusion constraint at the end: GiST equality on text. + createExtension('btree_gist'), + this.createSchema({ schema: 'public' }), + this.createTable({ + schema: 'public', + table: 'Booking', + columns: [ + col('booker', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('createdAt', 'timestamptz', { + notNull: true, + default: fn('now()'), + codecRef: { codecId: 'pg/timestamptz-date@1' }, + }), + col('endsAt', 'timestamptz', { + notNull: true, + codecRef: { codecId: 'pg/timestamptz-date@1' }, + }), + col('id', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('roomId', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('startsAt', 'timestamptz', { + notNull: true, + codecRef: { codecId: 'pg/timestamptz-date@1' }, + }), + col('title', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + ], + constraints: [ + primaryKey(['id']), + checkExpression('booking_ends_after_start_20c1ac54', '"endsAt" > "startsAt"'), + ], + }), + this.createTable({ + schema: 'public', + table: 'Room', + columns: [ + col('floor', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('id', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('name', 'text', { notNull: true, codecRef: { codecId: 'pg/text@1' } }), + col('seats', 'int4', { notNull: true, codecRef: { codecId: 'pg/int4@1' } }), + ], + constraints: [primaryKey(['id'])], + }), + this.addUnique({ + schema: 'public', + table: 'Room', + constraint: 'Room_name_key', + columns: ['name'], + }), + this.createIndex({ + schema: 'public', + table: 'Booking', + index: 'Booking_roomId_idx_fe51d647', + columns: ['roomId'], + }), + this.createIndex({ + schema: 'public', + table: 'Booking', + index: 'Booking_roomId_startsAt_idx_4f44cd3f', + columns: ['roomId', 'startsAt'], + }), + this.addForeignKey({ + schema: 'public', + table: 'Booking', + foreignKey: { + name: 'Booking_roomId_fkey', + columns: ['roomId'], + references: { schema: 'public', table: 'Room', columns: ['id'] }, + onDelete: 'cascade', + }, + }), + // Second line of defence, hand-written: the contract cannot express an + // exclusion constraint. Postgres itself refuses two bookings of the same + // room whose [startsAt, endsAt) ranges overlap, whoever writes them. + rawSql({ + id: 'constraint.booking.booking_no_overlap', + label: 'Add exclusion constraint "booking_no_overlap" on "Booking"', + operationClass: 'additive', + target: { id: 'postgres' }, + precheck: [ + { + description: 'constraint "booking_no_overlap" does not exist', + sql: `SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'booking_no_overlap')`, + }, + ], + execute: [ + { + description: 'add exclusion constraint', + sql: `ALTER TABLE "public"."Booking" ADD CONSTRAINT "booking_no_overlap" EXCLUDE USING gist ("roomId" WITH =, tstzrange("startsAt", "endsAt", '[)') WITH &&)`, + }, + ], + postcheck: [ + { + description: 'constraint "booking_no_overlap" exists', + sql: `SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'booking_no_overlap')`, + }, + ], + }), + ]; + } +} + +MigrationCLI.run(import.meta.url, M); diff --git a/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/ops.json b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/ops.json new file mode 100644 index 000000000000..7101bcaeca92 --- /dev/null +++ b/compute/room-booking-prisma-template/migrations/app/20261026T1925_init/ops.json @@ -0,0 +1,301 @@ +[ + { + "id": "extension.btree_gist", + "label": "Create extension \"btree_gist\"", + "operationClass": "additive", + "target": { + "id": "postgres" + }, + "precheck": [], + "execute": [ + { + "description": "Create extension \"btree_gist\"", + "sql": "CREATE EXTENSION IF NOT EXISTS \"btree_gist\"" + } + ], + "postcheck": [] + }, + { + "id": "schema.public", + "label": "Create schema \"public\"", + "operationClass": "additive", + "target": { + "id": "postgres" + }, + "precheck": [], + "execute": [ + { + "description": "Create schema \"public\"", + "sql": "CREATE SCHEMA IF NOT EXISTS \"public\"", + "params": [] + } + ], + "postcheck": [] + }, + { + "id": "table.Booking", + "label": "Create table \"Booking\"", + "summary": "Creates table \"Booking\"", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "table", + "name": "Booking" + } + }, + "precheck": [ + { + "description": "ensure table \"Booking\" does not exist", + "sql": "SELECT (to_regclass($1)) IS NULL AS \"result\"", + "params": [ + "\"public\".\"Booking\"" + ] + } + ], + "execute": [ + { + "description": "create table \"Booking\"", + "sql": "CREATE TABLE \"public\".\"Booking\" (\n \"booker\" text NOT NULL,\n \"createdAt\" timestamptz DEFAULT (now()) NOT NULL,\n \"endsAt\" timestamptz NOT NULL,\n \"id\" text NOT NULL,\n \"roomId\" text NOT NULL,\n \"startsAt\" timestamptz NOT NULL,\n \"title\" text NOT NULL,\n PRIMARY KEY (\"id\"),\n CONSTRAINT \"booking_ends_after_start_20c1ac54\" CHECK (\"endsAt\" > \"startsAt\")\n)", + "params": [] + } + ], + "postcheck": [ + { + "description": "verify table \"Booking\" exists", + "sql": "SELECT (to_regclass($1)) IS NOT NULL AS \"result\"", + "params": [ + "\"public\".\"Booking\"" + ] + } + ] + }, + { + "id": "table.Room", + "label": "Create table \"Room\"", + "summary": "Creates table \"Room\"", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "table", + "name": "Room" + } + }, + "precheck": [ + { + "description": "ensure table \"Room\" does not exist", + "sql": "SELECT (to_regclass($1)) IS NULL AS \"result\"", + "params": [ + "\"public\".\"Room\"" + ] + } + ], + "execute": [ + { + "description": "create table \"Room\"", + "sql": "CREATE TABLE \"public\".\"Room\" (\n \"floor\" text NOT NULL,\n \"id\" text NOT NULL,\n \"name\" text NOT NULL,\n \"seats\" int4 NOT NULL,\n PRIMARY KEY (\"id\")\n)", + "params": [] + } + ], + "postcheck": [ + { + "description": "verify table \"Room\" exists", + "sql": "SELECT (to_regclass($1)) IS NOT NULL AS \"result\"", + "params": [ + "\"public\".\"Room\"" + ] + } + ] + }, + { + "id": "unique.Room.Room_name_key", + "label": "Add unique constraint on \"Room\" (name)", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "unique", + "name": "Room_name_key", + "table": "Room" + } + }, + "precheck": [ + { + "description": "ensure constraint \"Room_name_key\" does not exist", + "sql": "SELECT NOT EXISTS (SELECT 1 AS \"one\" FROM \"pg_constraint\" AS \"c\" INNER JOIN \"pg_namespace\" AS \"n\" ON \"n\".\"oid\" = \"c\".\"connamespace\" WHERE (\"c\".\"conname\" = $1 AND \"n\".\"nspname\" = $2 AND \"c\".\"conrelid\" = to_regclass($3))) AS \"result\"", + "params": [ + "Room_name_key", + "public", + "\"public\".\"Room\"" + ] + } + ], + "execute": [ + { + "description": "add unique constraint \"Room_name_key\"", + "sql": "ALTER TABLE \"public\".\"Room\" ADD CONSTRAINT \"Room_name_key\" UNIQUE (\"name\")" + } + ], + "postcheck": [ + { + "description": "verify constraint \"Room_name_key\" exists", + "sql": "SELECT EXISTS (SELECT 1 AS \"one\" FROM \"pg_constraint\" AS \"c\" INNER JOIN \"pg_namespace\" AS \"n\" ON \"n\".\"oid\" = \"c\".\"connamespace\" WHERE (\"c\".\"conname\" = $1 AND \"n\".\"nspname\" = $2 AND \"c\".\"conrelid\" = to_regclass($3))) AS \"result\"", + "params": [ + "Room_name_key", + "public", + "\"public\".\"Room\"" + ] + } + ] + }, + { + "id": "index.Booking.Booking_roomId_idx_fe51d647", + "label": "Create index \"Booking_roomId_idx_fe51d647\" on \"Booking\"", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "index", + "name": "Booking_roomId_idx_fe51d647", + "table": "Booking" + } + }, + "precheck": [ + { + "description": "ensure index \"Booking_roomId_idx_fe51d647\" does not exist", + "sql": "SELECT (to_regclass($1)) IS NULL AS \"result\"", + "params": [ + "\"public\".\"Booking_roomId_idx_fe51d647\"" + ] + } + ], + "execute": [ + { + "description": "create index \"Booking_roomId_idx_fe51d647\"", + "sql": "CREATE INDEX \"Booking_roomId_idx_fe51d647\" ON \"public\".\"Booking\" (\"roomId\")", + "params": [] + } + ], + "postcheck": [ + { + "description": "verify index \"Booking_roomId_idx_fe51d647\" exists", + "sql": "SELECT (to_regclass($1)) IS NOT NULL AS \"result\"", + "params": [ + "\"public\".\"Booking_roomId_idx_fe51d647\"" + ] + } + ] + }, + { + "id": "index.Booking.Booking_roomId_startsAt_idx_4f44cd3f", + "label": "Create index \"Booking_roomId_startsAt_idx_4f44cd3f\" on \"Booking\"", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "index", + "name": "Booking_roomId_startsAt_idx_4f44cd3f", + "table": "Booking" + } + }, + "precheck": [ + { + "description": "ensure index \"Booking_roomId_startsAt_idx_4f44cd3f\" does not exist", + "sql": "SELECT (to_regclass($1)) IS NULL AS \"result\"", + "params": [ + "\"public\".\"Booking_roomId_startsAt_idx_4f44cd3f\"" + ] + } + ], + "execute": [ + { + "description": "create index \"Booking_roomId_startsAt_idx_4f44cd3f\"", + "sql": "CREATE INDEX \"Booking_roomId_startsAt_idx_4f44cd3f\" ON \"public\".\"Booking\" (\"roomId\", \"startsAt\")", + "params": [] + } + ], + "postcheck": [ + { + "description": "verify index \"Booking_roomId_startsAt_idx_4f44cd3f\" exists", + "sql": "SELECT (to_regclass($1)) IS NOT NULL AS \"result\"", + "params": [ + "\"public\".\"Booking_roomId_startsAt_idx_4f44cd3f\"" + ] + } + ] + }, + { + "id": "foreignKey.Booking.Booking_roomId_fkey", + "label": "Add foreign key \"Booking_roomId_fkey\" on \"Booking\"", + "operationClass": "additive", + "target": { + "id": "postgres", + "details": { + "schema": "public", + "objectType": "foreignKey", + "name": "Booking_roomId_fkey", + "table": "Booking" + } + }, + "precheck": [ + { + "description": "ensure FK \"Booking_roomId_fkey\" does not exist", + "sql": "SELECT NOT EXISTS (SELECT 1 AS \"one\" FROM \"pg_constraint\" AS \"c\" INNER JOIN \"pg_namespace\" AS \"n\" ON \"n\".\"oid\" = \"c\".\"connamespace\" WHERE (\"c\".\"conname\" = $1 AND \"n\".\"nspname\" = $2 AND \"c\".\"conrelid\" = to_regclass($3))) AS \"result\"", + "params": [ + "Booking_roomId_fkey", + "public", + "\"public\".\"Booking\"" + ] + } + ], + "execute": [ + { + "description": "add FK \"Booking_roomId_fkey\"", + "sql": "ALTER TABLE \"public\".\"Booking\"\nADD CONSTRAINT \"Booking_roomId_fkey\"\nFOREIGN KEY (\"roomId\")\nREFERENCES \"public\".\"Room\" (\"id\")\nON DELETE CASCADE" + } + ], + "postcheck": [ + { + "description": "verify FK \"Booking_roomId_fkey\" exists", + "sql": "SELECT EXISTS (SELECT 1 AS \"one\" FROM \"pg_constraint\" AS \"c\" INNER JOIN \"pg_namespace\" AS \"n\" ON \"n\".\"oid\" = \"c\".\"connamespace\" WHERE (\"c\".\"conname\" = $1 AND \"n\".\"nspname\" = $2 AND \"c\".\"conrelid\" = to_regclass($3))) AS \"result\"", + "params": [ + "Booking_roomId_fkey", + "public", + "\"public\".\"Booking\"" + ] + } + ] + }, + { + "id": "constraint.booking.booking_no_overlap", + "label": "Add exclusion constraint \"booking_no_overlap\" on \"Booking\"", + "operationClass": "additive", + "target": { + "id": "postgres" + }, + "precheck": [ + { + "description": "constraint \"booking_no_overlap\" does not exist", + "sql": "SELECT NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'booking_no_overlap')" + } + ], + "execute": [ + { + "description": "add exclusion constraint", + "sql": "ALTER TABLE \"public\".\"Booking\" ADD CONSTRAINT \"booking_no_overlap\" EXCLUDE USING gist (\"roomId\" WITH =, tstzrange(\"startsAt\", \"endsAt\", '[)') WITH &&)" + } + ], + "postcheck": [ + { + "description": "constraint \"booking_no_overlap\" exists", + "sql": "SELECT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'booking_no_overlap')" + } + ] + } +] \ No newline at end of file diff --git a/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.d.ts b/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.d.ts new file mode 100644 index 000000000000..32652633f5ee --- /dev/null +++ b/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.d.ts @@ -0,0 +1,616 @@ +// ⚠️ GENERATED FILE - DO NOT EDIT +// This file is automatically generated by 'prisma contract emit'. +// To regenerate, run: prisma contract emit +import type { + CodecTypes as PgTypes, + ParameterizedOutputTypesForTypeParams as PgParameterizedOutputTypes, +} from '@prisma/orm-postgres/target/codec-types'; +import type { QueryOperationTypes as PgTargetQueryOps } from '@prisma/orm-postgres/target/operation-types'; + +import type { + ColumnTypesFromStorage, + ContractWithTypeMaps, + RelationKeys, + TypeMaps as TypeMapsType, +} from '@prisma/orm-postgres/family-contract/types'; +import type { + Contract as ContractType, + ExecutionHashBase, + FieldTypesFromDomain, + NamespaceId, + ProfileHashBase, + StorageHashBase, +} from '@prisma/orm-postgres/contract/types'; + +export type StorageHash = + StorageHashBase<'dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2'>; +export type ExecutionHash = + ExecutionHashBase<'b9a096bcc0c24bca58765d4f5cff47e940b1a4b39c00aee407a38377c41dab2c'>; +export type ProfileHash = + ProfileHashBase<'3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2'>; + +export type CodecTypes = PgTypes; +export type LaneCodecTypes = CodecTypes; +export type QueryOperationTypes = PgTargetQueryOps; +export type AggregateTypes = { + readonly avg: { + readonly byCodec: { + readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + }; + }; + readonly avgDecimal: { + readonly byCodec: { + readonly 'pg/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + }; + }; + readonly count: { + readonly byCodec: {}; + readonly withoutInput: { readonly output: 'pg/int8number@1'; readonly nullable: false }; + readonly anyInput: { readonly output: 'pg/int8number@1'; readonly nullable: false }; + }; + readonly countBigInt: { + readonly byCodec: {}; + readonly withoutInput: { readonly output: 'pg/int8@1'; readonly nullable: false }; + readonly anyInput: { readonly output: 'pg/int8@1'; readonly nullable: false }; + }; + readonly max: { + readonly byCodec: { + readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true }; + readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true }; + readonly 'pg/date-temporal@1': { + readonly output: 'pg/date-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true }; + readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true }; + readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { + readonly output: 'pg/time-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-string@1': { + readonly output: 'pg/timestamp-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-temporal@1': { + readonly output: 'pg/timestamp-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-date@1': { + readonly output: 'pg/timestamptz-date@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-string@1': { + readonly output: 'pg/timestamptz-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-temporal@1': { + readonly output: 'pg/timestamptz-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true }; + readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true }; + readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + }; + }; + readonly min: { + readonly byCodec: { + readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true }; + readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true }; + readonly 'pg/date-temporal@1': { + readonly output: 'pg/date-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true }; + readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true }; + readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { + readonly output: 'pg/time-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-string@1': { + readonly output: 'pg/timestamp-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-temporal@1': { + readonly output: 'pg/timestamp-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-date@1': { + readonly output: 'pg/timestamptz-date@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-string@1': { + readonly output: 'pg/timestamptz-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-temporal@1': { + readonly output: 'pg/timestamptz-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true }; + readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true }; + readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + }; + }; + readonly sum: { + readonly byCodec: { + readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + }; + }; + readonly sumBigInt: { + readonly byCodec: { + readonly 'pg/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'sql/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + }; + }; +}; +type DefaultLiteralValue = CodecId extends keyof CodecTypes + ? Encoded extends CodecTypes[CodecId]['json'] + ? Encoded + : CodecTypes[CodecId]['json'] + : Encoded; +type ParameterizedOutputTypeFunctions = PgParameterizedOutputTypes; + +type FieldTypeOverrides = {}; +export type FieldOutputTypes = FieldTypesFromDomain< + ContractBase['domain']['namespaces'], + CodecTypes, + ParameterizedOutputTypeFunctions, + FieldTypeOverrides, + 'output' +>; +export type FieldInputTypes = FieldTypesFromDomain< + ContractBase['domain']['namespaces'], + CodecTypes, + ParameterizedOutputTypeFunctions, + FieldTypeOverrides, + 'input' +>; +type ColumnTypeOverrides = {}; +export type StorageColumnTypes = ColumnTypesFromStorage< + ContractBase['storage'], + CodecTypes, + ParameterizedOutputTypeFunctions, + ColumnTypeOverrides, + 'output' +>; +export type StorageColumnInputTypes = ColumnTypesFromStorage< + ContractBase['storage'], + CodecTypes, + ParameterizedOutputTypeFunctions, + ColumnTypeOverrides, + 'input' +>; + +export namespace Models { + export type public_Booking = { + booker: FieldOutputTypes['public']['Booking']['booker']; + createdAt: FieldOutputTypes['public']['Booking']['createdAt']; + endsAt: FieldOutputTypes['public']['Booking']['endsAt']; + id: FieldOutputTypes['public']['Booking']['id']; + roomId: FieldOutputTypes['public']['Booking']['roomId']; + startsAt: FieldOutputTypes['public']['Booking']['startsAt']; + title: FieldOutputTypes['public']['Booking']['title']; + room: public_Room; + readonly [RelationKeys]?: 'room'; + }; + export type public_Room = { + floor: FieldOutputTypes['public']['Room']['floor']; + id: FieldOutputTypes['public']['Room']['id']; + name: FieldOutputTypes['public']['Room']['name']; + seats: FieldOutputTypes['public']['Room']['seats']; + bookings: public_Booking[]; + readonly [RelationKeys]?: 'bookings'; + }; +} + +export declare const models: { + public: { + Booking: Models.public_Booking; + Room: Models.public_Room; + }; +}; + +export type TypeMaps = TypeMapsType< + CodecTypes, + QueryOperationTypes, + FieldOutputTypes, + FieldInputTypes, + StorageColumnTypes, + StorageColumnInputTypes, + AggregateTypes +>; + +type ContractBase = Omit< + ContractType<{ + readonly namespaces: { + readonly public: { + readonly id: 'public'; + readonly kind: 'postgres-schema'; + readonly entries: { + readonly table: { + readonly Booking: { + columns: { + readonly booker: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly createdAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly default: { readonly kind: 'function'; readonly expression: 'now()' }; + readonly many: false; + }; + readonly endsAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly many: false; + }; + readonly id: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly roomId: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly startsAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly many: false; + }; + readonly title: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + }; + primaryKey: { readonly columns: readonly ['id'] }; + uniques: readonly []; + indexes: readonly [ + { + readonly name: 'Booking_roomId_idx_fe51d647'; + readonly prefix: 'Booking_roomId_idx'; + readonly columns: readonly ['roomId']; + readonly unique: false; + }, + { + readonly name: 'Booking_roomId_startsAt_idx_4f44cd3f'; + readonly prefix: 'Booking_roomId_startsAt_idx'; + readonly columns: readonly ['roomId', 'startsAt']; + readonly unique: false; + }, + ]; + foreignKeys: readonly [ + { + readonly source: { + readonly namespaceId: 'public' & NamespaceId; + readonly tableName: 'Booking'; + readonly columns: readonly ['roomId']; + }; + readonly target: { + readonly namespaceId: 'public' & NamespaceId; + readonly tableName: 'Room'; + readonly columns: readonly ['id']; + }; + }, + ]; + }; + readonly Room: { + columns: { + readonly floor: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly id: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly name: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly seats: { + readonly dataType: 'pg/int4'; + readonly codecId: 'pg/int4@1'; + readonly nullable: false; + readonly many: false; + }; + }; + primaryKey: { readonly columns: readonly ['id'] }; + uniques: readonly [{ readonly columns: readonly ['name'] }]; + indexes: readonly []; + foreignKeys: readonly []; + }; + }; + }; + }; + }; + readonly storageHash: StorageHash; + }>, + 'roots' | 'domain' +> & { + readonly target: 'postgres'; + readonly targetFamily: 'sql'; + readonly roots: { + readonly Booking: { readonly namespace: 'public' & NamespaceId; readonly model: 'Booking' }; + readonly Room: { readonly namespace: 'public' & NamespaceId; readonly model: 'Room' }; + }; + readonly domain: { + readonly namespaces: { + readonly public: { + readonly models: { + readonly Booking: { + readonly fields: { + readonly booker: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly createdAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly endsAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly id: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly roomId: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly startsAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly title: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + }; + readonly relations: { + readonly room: { + readonly to: { readonly namespace: 'public' & NamespaceId; readonly model: 'Room' }; + readonly cardinality: 'N:1'; + readonly nullable: false; + readonly on: { + readonly localFields: readonly ['roomId']; + readonly targetFields: readonly ['id']; + }; + }; + }; + readonly storage: { + readonly table: 'Booking'; + readonly namespaceId: 'public'; + readonly fields: { + readonly booker: { readonly column: 'booker' }; + readonly createdAt: { readonly column: 'createdAt' }; + readonly endsAt: { readonly column: 'endsAt' }; + readonly id: { readonly column: 'id' }; + readonly roomId: { readonly column: 'roomId' }; + readonly startsAt: { readonly column: 'startsAt' }; + readonly title: { readonly column: 'title' }; + }; + }; + }; + readonly Room: { + readonly fields: { + readonly floor: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly id: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly name: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly seats: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/int4@1' }; + }; + }; + readonly relations: { + readonly bookings: { + readonly to: { + readonly namespace: 'public' & NamespaceId; + readonly model: 'Booking'; + }; + readonly cardinality: '1:N'; + readonly on: { + readonly localFields: readonly ['id']; + readonly targetFields: readonly ['roomId']; + }; + }; + }; + readonly storage: { + readonly table: 'Room'; + readonly namespaceId: 'public'; + readonly fields: { + readonly floor: { readonly column: 'floor' }; + readonly id: { readonly column: 'id' }; + readonly name: { readonly column: 'name' }; + readonly seats: { readonly column: 'seats' }; + }; + }; + }; + }; + }; + }; + }; + readonly capabilities: { + readonly postgres: { + readonly distinctOn: true; + readonly forKeyShare: true; + readonly forNoKeyUpdate: true; + readonly jsonAgg: true; + readonly lateral: true; + readonly limit: true; + readonly orderBy: true; + readonly returning: true; + }; + readonly sql: { + readonly checkConstraint: true; + readonly defaultInInsert: true; + readonly enums: true; + readonly forShare: true; + readonly forUpdate: true; + readonly insertOnConflictSkip: true; + readonly insertOnConflictWithoutTarget: true; + readonly lateral: true; + readonly lockNowait: true; + readonly lockOf: true; + readonly lockSkipLocked: true; + readonly returning: true; + readonly scalarList: true; + }; + }; + readonly extensions: {}; + readonly execution: { + readonly executionHash: ExecutionHash; + readonly mutations: { + readonly defaults: readonly [ + { + readonly onCreate: { readonly id: 'cuid2'; readonly kind: 'generator' }; + readonly ref: { + readonly entry: 'Booking'; + readonly field: 'id'; + readonly namespace: 'public'; + }; + }, + { + readonly onCreate: { readonly id: 'cuid2'; readonly kind: 'generator' }; + readonly ref: { + readonly entry: 'Room'; + readonly field: 'id'; + readonly namespace: 'public'; + }; + }, + ]; + }; + }; + readonly meta: {}; + + readonly profileHash: ProfileHash; +}; + +export type Contract = ContractWithTypeMaps; + +export type Namespaces = Contract['storage']['namespaces']; diff --git a/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.json b/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.json new file mode 100644 index 000000000000..42590df6d410 --- /dev/null +++ b/compute/room-booking-prisma-template/migrations/snapshots/dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2/contract.json @@ -0,0 +1 @@ +{"_generated":{"message":"This file is automatically generated by \"prisma contract emit\".","regenerate":"To regenerate, run: prisma contract emit","warning":"⚠️ GENERATED FILE - DO NOT EDIT"},"capabilities":{"postgres":{"distinctOn":true,"forKeyShare":true,"forNoKeyUpdate":true,"jsonAgg":true,"lateral":true,"limit":true,"orderBy":true,"returning":true},"sql":{"checkConstraint":true,"defaultInInsert":true,"enums":true,"forShare":true,"forUpdate":true,"insertOnConflictSkip":true,"insertOnConflictWithoutTarget":true,"lateral":true,"lockNowait":true,"lockOf":true,"lockSkipLocked":true,"returning":true,"scalarList":true}},"domain":{"namespaces":{"public":{"models":{"Booking":{"fields":{"booker":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"createdAt":{"nullable":false,"type":{"codecId":"pg/timestamptz-date@1","kind":"scalar"}},"endsAt":{"nullable":false,"type":{"codecId":"pg/timestamptz-date@1","kind":"scalar"}},"id":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"roomId":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"startsAt":{"nullable":false,"type":{"codecId":"pg/timestamptz-date@1","kind":"scalar"}},"title":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}}},"relations":{"room":{"cardinality":"N:1","nullable":false,"on":{"localFields":["roomId"],"targetFields":["id"]},"to":{"model":"Room","namespace":"public"}}},"storage":{"fields":{"booker":{"column":"booker"},"createdAt":{"column":"createdAt"},"endsAt":{"column":"endsAt"},"id":{"column":"id"},"roomId":{"column":"roomId"},"startsAt":{"column":"startsAt"},"title":{"column":"title"}},"namespaceId":"public","table":"Booking"}},"Room":{"fields":{"floor":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"id":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"name":{"nullable":false,"type":{"codecId":"pg/text@1","kind":"scalar"}},"seats":{"nullable":false,"type":{"codecId":"pg/int4@1","kind":"scalar"}}},"relations":{"bookings":{"cardinality":"1:N","on":{"localFields":["id"],"targetFields":["roomId"]},"to":{"model":"Booking","namespace":"public"}}},"storage":{"fields":{"floor":{"column":"floor"},"id":{"column":"id"},"name":{"column":"name"},"seats":{"column":"seats"}},"namespaceId":"public","table":"Room"}}}}}},"execution":{"executionHash":"b9a096bcc0c24bca58765d4f5cff47e940b1a4b39c00aee407a38377c41dab2c","mutations":{"defaults":[{"onCreate":{"id":"cuid2","kind":"generator"},"ref":{"entry":"Booking","field":"id","namespace":"public"}},{"onCreate":{"id":"cuid2","kind":"generator"},"ref":{"entry":"Room","field":"id","namespace":"public"}}]}},"extensions":{},"meta":{},"profileHash":"3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2","roots":{"Booking":{"model":"Booking","namespace":"public"},"Room":{"model":"Room","namespace":"public"}},"schemaVersion":"1","storage":{"namespaces":{"public":{"entries":{"table":{"Booking":{"checks":[{"expression":"\"endsAt\" > \"startsAt\"","name":"booking_ends_after_start_20c1ac54","prefix":"booking_ends_after_start"}],"columns":{"booker":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"createdAt":{"codecId":"pg/timestamptz-date@1","dataType":"pg/timestamptz","default":{"expression":"now()","kind":"function"},"nullable":false},"endsAt":{"codecId":"pg/timestamptz-date@1","dataType":"pg/timestamptz","nullable":false},"id":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"roomId":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"startsAt":{"codecId":"pg/timestamptz-date@1","dataType":"pg/timestamptz","nullable":false},"title":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false}},"foreignKeys":[{"index":{"name":"Booking_roomId_idx_fe51d647"},"onDelete":"cascade","source":{"columns":["roomId"],"namespaceId":"public","tableName":"Booking"},"target":{"columns":["id"],"namespaceId":"public","tableName":"Room"}}],"indexes":[{"columns":["roomId"],"name":"Booking_roomId_idx_fe51d647","prefix":"Booking_roomId_idx","unique":false},{"columns":["roomId","startsAt"],"name":"Booking_roomId_startsAt_idx_4f44cd3f","prefix":"Booking_roomId_startsAt_idx","unique":false}],"primaryKey":{"columns":["id"]},"uniques":[]},"Room":{"columns":{"floor":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"id":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"name":{"codecId":"pg/text@1","dataType":"pg/text","nullable":false},"seats":{"codecId":"pg/int4@1","dataType":"pg/int4","nullable":false}},"foreignKeys":[],"indexes":[],"primaryKey":{"columns":["id"]},"uniques":[{"columns":["name"]}]}}},"id":"public","kind":"postgres-schema"}},"storageHash":"dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2"},"target":"postgres","targetFamily":"sql"} diff --git a/compute/room-booking-prisma-template/module.ts b/compute/room-booking-prisma-template/module.ts new file mode 100644 index 000000000000..04d6644493ac --- /dev/null +++ b/compute/room-booking-prisma-template/module.ts @@ -0,0 +1,18 @@ +import { module } from "@prisma/composer"; +import { postgres } from "@prisma/composer-prisma-cloud/orm"; + +import { appContract } from "./src/prisma/composer.ts"; +import app from "./service.ts"; + +export default module("room-booking-prisma-template", ({ provision }) => { + const database = provision( + postgres({ + name: "database", + contract: appContract, + config: "./prisma.config.ts", + }), + { id: "database" }, + ); + + provision(app, { deps: { database } }); +}); diff --git a/compute/room-booking-prisma-template/next.config.ts b/compute/room-booking-prisma-template/next.config.ts new file mode 100644 index 000000000000..ad64815ddb3c --- /dev/null +++ b/compute/room-booking-prisma-template/next.config.ts @@ -0,0 +1,14 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + // Prisma Compute runs the standalone server that `next build` writes. + // Without it the deploy completes, but the URL answers 504. + output: "standalone", + // The app has no images to optimize. Turning the optimizer off and leaving + // sharp's native binaries (~46 MB) out of the standalone output makes the + // upload of every deploy about three times smaller. + images: { unoptimized: true }, + outputFileTracingExcludes: { "*": ["node_modules/sharp/**", "node_modules/@img/**"] }, +}; + +export default nextConfig; diff --git a/compute/room-booking-prisma-template/package-lock.json b/compute/room-booking-prisma-template/package-lock.json new file mode 100644 index 000000000000..6846b847200f --- /dev/null +++ b/compute/room-booking-prisma-template/package-lock.json @@ -0,0 +1,13634 @@ +{ + "name": "room-booking-prisma-template", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "room-booking-prisma-template", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@prisma/composer": "0.29.1", + "@prisma/composer-prisma-cloud": "0.29.1", + "@prisma/orm-postgres": "8.0.0-rc.17", + "alchemy": "2.0.0-beta.78", + "effect": "4.0.0-rc.115", + "next": "16.4.2", + "react": "19.3.1", + "react-dom": "19.3.1", + "resource-scheduler": "^1.6.0", + "temporal-polyfill": "^1.0.6", + "zod": "^4.6.7" + }, + "devDependencies": { + "@prisma/dev": "0.25.2", + "@types/node": "^26.6.5", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "eslint": "^10.13.0", + "eslint-config-next": "16.4.2", + "prisma": "8.0.0-rc.22", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vitest": "^5.0.5" + }, + "engines": { + "node": ">=24.11.1" + } + }, + "node_modules/@alchemy.run/cloudflare-runtime": { + "version": "2.0.0-beta.78", + "resolved": "https://registry.npmjs.org/@alchemy.run/cloudflare-runtime/-/cloudflare-runtime-2.0.0-beta.78.tgz", + "integrity": "sha512-fsNiicISo7gOFPwrfAbRQAfB8RUSwfsFtgb7n54NSinqARxiULJ4vCyn7RuLrZ9d32S0wt6/QwuNAeliGvulfw==", + "license": "Apache-2.0", + "dependencies": { + "@alchemy.run/node-utils": "2.0.0-beta.78", + "@cloudflare/unenv-preset": "^2.16.1", + "@puppeteer/browsers": "^3.2.0", + "capnp-es": "^0.0.16", + "magic-string": "^0.30.21", + "sharp": "^0.35.3", + "unenv": "^2.0.0-rc.24", + "workerd": "1.20260901.1", + "yauzl": "^3.4.0" + }, + "peerDependencies": { + "@distilled.cloud/cloudflare": "1.0.0-rc.12", + "@effect/platform-bun": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/platform-node": ">=4.0.0-rc.115 || >=4.0.0", + "effect": ">=4.0.0-rc.115 || >=4.0.0", + "rolldown": "1.2.5", + "vite": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@effect/platform-bun": { + "optional": true + }, + "@effect/platform-node": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@alchemy.run/floci": { + "version": "2.0.0-beta.78", + "resolved": "https://registry.npmjs.org/@alchemy.run/floci/-/floci-2.0.0-beta.78.tgz", + "integrity": "sha512-f+XDNleOUF/OU2GKMGGz8x674Ejg/cUf+xKeNByrTNok8OYFN8kO1Cev9gFiFB3JZjW6o6hARBb3MDEuYRAyDg==", + "license": "Apache-2.0", + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@alchemy.run/node-utils": { + "version": "2.0.0-beta.78", + "resolved": "https://registry.npmjs.org/@alchemy.run/node-utils/-/node-utils-2.0.0-beta.78.tgz", + "integrity": "sha512-tNp202VlDbN7ONlx7Zv7dDbicZerZUOzyfi1RNtTH/POXe+BaDA+Tl5CvhNCsn3l/adWpqNc/3jkQIh47K1Q0w==", + "license": "Apache-2.0", + "dependencies": { + "chokidar": "^5.0.0", + "rolldown": "1.2.5" + } + }, + "node_modules/@alchemy.run/sigil": { + "version": "0.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@alchemy.run/sigil/-/sigil-0.0.0-alpha.11.tgz", + "integrity": "sha512-JzaCBeRu9kY0qWC8JKkrierstImkrK77dl+7l0RvCTR+7uhOJECL2VxmjhJ1blea+mmbYUVob8OXOH5r8Mqfpw==", + "license": "MIT", + "dependencies": { + "react": "^19.3.0", + "react-reconciler": "^0.34.0", + "scheduler": "^0.28.0" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@types/react": ">=19.2.0", + "react-devtools-core": ">=6.1.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react-devtools-core": { + "optional": true + } + } + }, + "node_modules/@ark/schema": { + "version": "0.56.8", + "resolved": "https://registry.npmjs.org/@ark/schema/-/schema-0.56.8.tgz", + "integrity": "sha512-R05TOe85oQBGFFw2zKMuZpqkXibLKuC/aJt6VwFn5Cjc4x3NkWfhvGRpRDycNkj3ddcHnOPtIsmjVowJO9Yxdw==", + "license": "MIT", + "dependencies": { + "@ark/util": "0.56.8" + } + }, + "node_modules/@ark/util": { + "version": "0.56.8", + "resolved": "https://registry.npmjs.org/@ark/util/-/util-0.56.8.tgz", + "integrity": "sha512-XLiQyGfpJcws1zCtp2Cva8s1oheCdFn1Rt6JSyC4NnkDrpwCJnlaiawuuOc1Z97vMH+jEzW5vyyf0xOju5wUQA==", + "license": "MIT" + }, + "node_modules/@aws-sdk/core": { + "version": "3.978.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.978.6.tgz", + "integrity": "sha512-ykF/MiYoM15dgZwF/WLgjJXVbAK2wU6vjPigeEnOHwyUJ0rdlraO5uekecKNVPkvOnz+oju/5zljViQs1nI1FQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.975.0", + "@aws-sdk/xml-builder": "^3.972.41", + "@aws/lambda-invoke-store": "^0.3.0", + "@smithy/core": "^3.37.0", + "@smithy/signature-v4": "^5.7.4", + "@smithy/types": "^4.19.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity": { + "version": "3.972.76", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.972.76.tgz", + "integrity": "sha512-p5RrwE/jGpCJ+JmXy6hv2ULpvLYIe2648tK29uKaCa5sM2NmaM7iCS9Z/ZG2jq6qCvNbdl/bBT1/AME+mAJaJw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.77", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.77.tgz", + "integrity": "sha512-CN6dQCDo32a8n2gvm2HBeqGV5BNI9noG96nTj5bGO2HWtt0Rucu/A8pcnJIqkzILOHSuilnCk0Do8/7h6SOXhQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.79", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.79.tgz", + "integrity": "sha512-Netsu0nnmvP2HiN1ZFQBeUu+JehQIuubqz+j2kHDgeSE4HDzniCpIZ7RzoWABq+LTcbCi9W03hywifUagoVIWQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/fetch-http-handler": "^5.8.0", + "@smithy/node-http-handler": "^4.13.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.973.22", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.22.tgz", + "integrity": "sha512-x7/5h58cqOoZR0RWUZC7v/cJOADQR42iSIQkvU+00HVHR4jh8ZpqEgRPGf2zei59iH5qP40lL3bkq49PuWl71g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/credential-provider-env": "^3.972.77", + "@aws-sdk/credential-provider-http": "^3.972.79", + "@aws-sdk/credential-provider-login": "^3.972.84", + "@aws-sdk/credential-provider-process": "^3.972.77", + "@aws-sdk/credential-provider-sso": "^3.973.21", + "@aws-sdk/credential-provider-web-identity": "^3.972.83", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/credential-provider-imds": "^4.5.2", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.84", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.84.tgz", + "integrity": "sha512-G9Ty1uIV0laEvEp2KiMbEhsuBAjgaD3KYrwVjAM5VUxpcIuPBqQI5riA7/qzrnSgYiAKQbubbgkwcqCICKCIxg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.89", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.89.tgz", + "integrity": "sha512-O8xj7/sanrnXfFHu/LUujVBiiwn5mknYenU7xt1w6+yvhR1QoDZWXLFh1gLITaFVPtb1jWgEirC+kFNw+//tyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.77", + "@aws-sdk/credential-provider-http": "^3.972.79", + "@aws-sdk/credential-provider-ini": "^3.973.22", + "@aws-sdk/credential-provider-process": "^3.972.77", + "@aws-sdk/credential-provider-sso": "^3.973.21", + "@aws-sdk/credential-provider-web-identity": "^3.972.83", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/credential-provider-imds": "^4.5.2", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.77", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.77.tgz", + "integrity": "sha512-sWA8Jm+ASzkTxoqLizHWRbt8Gj3yZCmZ0hYdvg0uIxuLzWseYcfrDFzaSnkRWlEWSJV38rAWFimdrN0J4NR7Pg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.973.21", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.21.tgz", + "integrity": "sha512-KV2LM8fbYUhDzGEBnPwb+ISNfNlhmnpLS+y6A6VsJpg1EI9aUJ0+dRTxh2GrGdneFH0T4TiuboHxz8i6+M38JA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/token-providers": "3.1157.0", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.83", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.83.tgz", + "integrity": "sha512-iekYilmo2Re51fC7gMkEfZ7jFDXwehSCmXjDESaYQsdgYhsLQFG7rTYr3GBvRIyj+Fkda2NxbZX7hAZDaFD0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers": { + "version": "3.1157.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.1157.0.tgz", + "integrity": "sha512-9VQagtAZ/5HZfjxaOBponZTQ3yScvkHe93yDUROBVGnB4PM0nZZofwtDdyZqzb4jSHa5m03c7NmGSqniB8n5nQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/credential-provider-cognito-identity": "^3.972.76", + "@aws-sdk/credential-provider-env": "^3.972.77", + "@aws-sdk/credential-provider-http": "^3.972.79", + "@aws-sdk/credential-provider-ini": "^3.973.22", + "@aws-sdk/credential-provider-login": "^3.972.84", + "@aws-sdk/credential-provider-node": "^3.972.89", + "@aws-sdk/credential-provider-process": "^3.972.77", + "@aws-sdk/credential-provider-sso": "^3.973.21", + "@aws-sdk/credential-provider-web-identity": "^3.972.83", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/credential-provider-imds": "^4.5.2", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.997.51", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.51.tgz", + "integrity": "sha512-DJK4iGIHWU8Jh8ODMvqFYcX9yGBMXV4tSZAvqlHF5EDd8hbmF3eFO9KIWOnA7wcQjPzEkyMMW1/FgZ9RU8oimQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/signature-v4-multi-region": "^3.996.49", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/fetch-http-handler": "^5.8.0", + "@smithy/node-http-handler": "^4.13.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.49", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.49.tgz", + "integrity": "sha512-nvuAZNRrRRVCiARRKsYlQ0VnXiEQiq7vXPH+UA+LSo+kN3Djl9eo/V2r0udkw85PnsNshmv2Em1clld5M3j67w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.975.0", + "@smithy/signature-v4": "^5.7.4", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1157.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1157.0.tgz", + "integrity": "sha512-AeAzcwWRP2uANO2TjFpKjRdvOCzgfIu6YQl9Ceibd6E0gnq5dfOzujFnq2aeqgbLg4wRtXbUZE4gekCCPrz/OQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.978.6", + "@aws-sdk/nested-clients": "^3.997.51", + "@aws-sdk/types": "^3.975.0", + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.975.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.975.0.tgz", + "integrity": "sha512-WQlhs6juByzWOzj5fwxOx0mPJaEqMcG/sDpl3Id61B3XhKE63xY+0QWcnG+sWR/sCfprmreyUo1lM7IKZmHMzw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.41.tgz", + "integrity": "sha512-ctjVSyCMegrWfXlx6VqzSBFI6UqmQ5ZlnfMhdLIiWmhoH8UAQxSCP5N3OpG7X3k4LnS7ou74C4mt20+bfTW2aQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.3.0.tgz", + "integrity": "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.11" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.11", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz", + "integrity": "sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/gast": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-10.5.0.tgz", + "integrity": "sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "10.5.0", + "lodash": "4.17.21" + } + }, + "node_modules/@chevrotain/types": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-10.5.0.tgz", + "integrity": "sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-10.5.0.tgz", + "integrity": "sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==", + "license": "Apache-2.0" + }, + "node_modules/@clack/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-1.4.0.tgz", + "integrity": "sha512-7Wctjq6f7c1CPz8sPpkwUnz8yRgVANkpNupb81q432FjcJg4l+Sw7XANdNSdWfAKq0IHI0JTcUeK5dxs/HrGPw==", + "license": "MIT", + "dependencies": { + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@clack/prompts": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-1.5.0.tgz", + "integrity": "sha512-wKh+wTjmrUoUdkZg8KpJO5X+p9PWV+KE9mePseq9UYWkukgTKsGS47RRL2HstwVcvDQH+PenrPJWII8+MfiiyA==", + "license": "MIT", + "dependencies": { + "@clack/core": "1.4.0", + "fast-string-width": "^3.0.2", + "fast-wrap-ansi": "^0.2.0", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 20.12.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.2.tgz", + "integrity": "sha512-JBP1+Z7ZSNG/d4mRP+y8VC5dka3tZVMLEZRvS+rzQ4DGV1EoxRFQckcJTTkXbHSQiTj0DtNI01Zwb/V2fX0mvQ==", + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260901.1.tgz", + "integrity": "sha512-5nJCpnclV6cc5v3aZOewu+djFvNvm9A/owQ+WJ2G1450roeFHfZGsyW7vVjSRWx3v2iykfkviyJfGm9ApeFDGg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260901.1.tgz", + "integrity": "sha512-nLwfUVoYmFNW1Ntp0BfZ2K1UWIll4zTTYP8Ni7NQnyrNkTnFeU/prrllWtnw7OG8Z/jyaEAAFaDFEBobrNTU3A==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260901.1.tgz", + "integrity": "sha512-wzCO0cMrFLRRs6bG5KXDpLSe70GpzpsxPjxwBzQngQOfyI2cxs5i4Rb5rDB0GG8E19feZEhjGXcHgY9+5Lq8YA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260901.1.tgz", + "integrity": "sha512-aBk82+sSphMa6uR6h/CFN/GXmELJ2YOgQKYSsOsCTvbVLvHjclmyoEdLTY5FEImvo1ch1uXpGQgTjI8/suHGEg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260901.1.tgz", + "integrity": "sha512-3oJnCV7mWwzqmqz+3E+KYLbw1FylH+8n+p84srWv9MEsY9II1QuKiRKVf3CQTIdTDb6rkr5fCuRtkmLgRpAsNg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workers-types": { + "version": "5.20261027.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-5.20261027.1.tgz", + "integrity": "sha512-ZYhpdIJbEzQL68kwHRTq/B0hyBsxB7wXR17LmUln7ReWE2kxQ1LD//aTM1K8Jk/MuNBeQY66QLc9izUIOLWWyg==", + "license": "MIT OR Apache-2.0" + }, + "node_modules/@distilled.cloud/aws": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/aws/-/aws-1.0.0-rc.12.tgz", + "integrity": "sha512-L4TTEwMKB1ymXbYUqvYeoy5UWgmJtqQSzry2qWtAvD2ccwVGy0F7cFViEIYQk7boF4ZIP6SfhAls4+y1fVIi/g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.974.3", + "@distilled.cloud/core": "1.0.0-rc.12", + "@smithy/shared-ini-file-loader": "^4.7.0", + "@smithy/types": "^4.17.2", + "@smithy/util-base64": "^4.6.0", + "fast-xml-parser": "^5.10.1" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/axiom": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/axiom/-/axiom-1.0.0-rc.12.tgz", + "integrity": "sha512-W/Kx0qKXh/RF5bJeLNr73BTLV51AFf7zsP8pG9wv2yGrA8sPj4Xu2z72sBG+TeQZIhNwA8Rh4J8GotNqH/380g==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/cloudflare": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/cloudflare/-/cloudflare-1.0.0-rc.12.tgz", + "integrity": "sha512-ddcL4RnAx6L8gRWCnE5T1W35ZlerI7SlaRLidX726iG/K/aA+bkU0ND39y7ljJ2Eyx3zR03TfpNrgXAXc9E3ng==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/core": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/core/-/core-1.0.0-rc.12.tgz", + "integrity": "sha512-YeH/uPohGXp2qIctbqVzBtQV+bUs+K5Zdac8qIid7/t6VlwY964SALme5znRdFu/rQgrloXnaej8iTSK9RIQdA==", + "license": "Apache-2.0", + "dependencies": { + "graphql": "16.11.0" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/fly-io": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/fly-io/-/fly-io-1.0.0-rc.12.tgz", + "integrity": "sha512-ACgR8Kcx/OP8gAF+PnXYneGGZNUqyiQHrcTB3/lRcv5gQdacXhTAvreV/d0t7jclRo5BBdNxnd5TuuHpr9vDLA==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/hetzner": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/hetzner/-/hetzner-1.0.0-rc.12.tgz", + "integrity": "sha512-G6QzOXTNply63I90IjOtNofs0nHkEd1we/fgXiOjobLZt4+sKjjNBVTAHYHGMDeidbtxw270oF9JakgT11Pzww==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/neon": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/neon/-/neon-1.0.0-rc.12.tgz", + "integrity": "sha512-jiypsVQCcKa9qNgG9HULXNgXj1E4FFO96Hk9p2JX6CEHca7ePldJSJEOf7roogQGC7lrnldBDCiZrxQLOapD3Q==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/planetscale": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/planetscale/-/planetscale-1.0.0-rc.12.tgz", + "integrity": "sha512-YCTB7soZtqzzgcCAUtrNHjAIsq92XS8cpjnbn3VU+sCQ0LnfnFGeMGJxQ/7qLHtx7Hv4+Ms8XNOs2Q5P81Skig==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/prisma": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/prisma/-/prisma-1.0.0-rc.12.tgz", + "integrity": "sha512-Z1KyUrhxkUt0KdxmNUd29Dtl9NizKv7HFHUuTcA1j6Ar5apUMvlR0f4lKqpliXW8Om3oVS3Wgvm+gDsxul2Ojg==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/railway": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/railway/-/railway-1.0.0-rc.12.tgz", + "integrity": "sha512-KOXSpl7r9qTiOYabJ6wUmM418exzv6YE5BVztaqKSGMuNGP/lAqhZm709/p97Zg6vHpxhJLIgmCq00z7hRM3sQ==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@distilled.cloud/stripe": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@distilled.cloud/stripe/-/stripe-1.0.0-rc.12.tgz", + "integrity": "sha512-4OuZF362yU66G1jDFDgRFFv8ZNRPZ6lw8Wrd5R/isRNHpGgvggLNlKg1QXWEQaTcRzn3RBXczqQCVwQV9IRZDQ==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/core": "1.0.0-rc.12" + }, + "peerDependencies": { + "effect": ">=4.0.0-rc.115 || >=4.0.0" + } + }, + "node_modules/@effect/platform-bun": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/platform-bun/-/platform-bun-4.0.0-rc.115.tgz", + "integrity": "sha512-ilTFcs66ghInP8WHCJYa4bx/yzohYM9dRR//qjmVBBpSKu1hrCTiRWpEcc1N6zrnOEPk2kyVaKg5ykSMgiBMqQ==", + "license": "MIT", + "dependencies": { + "@effect/platform-node-shared": "^4.0.0-rc.115" + }, + "peerDependencies": { + "effect": "^4.0.0-rc.115" + } + }, + "node_modules/@effect/platform-node": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/platform-node/-/platform-node-4.0.0-rc.115.tgz", + "integrity": "sha512-mW03Wjq2FiTL5oi9yOkaKpCyUNBaduKgTk7qMHNELvC21Jq2qOAfdsfH+p+s2zmpB9w2RSa+ApODv4WjO9wQfw==", + "license": "MIT", + "dependencies": { + "@effect/platform-node-shared": "^4.0.0-rc.115", + "undici": "^8.10.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "effect": "^4.0.0-rc.115", + "redis": ">=5.0.0 <7.0.0" + } + }, + "node_modules/@effect/platform-node-shared": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/platform-node-shared/-/platform-node-shared-4.0.0-rc.115.tgz", + "integrity": "sha512-rcBwhDIfb82akJoTv7Vwh8K5x9vC/XfuePS7JjOr+z+dORXzsmKqI1BUQF27ARCN9fTAbDh7I6YvBlWhLjnqNg==", + "license": "MIT", + "dependencies": { + "@types/ws": "^8.18.1", + "ws": "^8.21.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "effect": "^4.0.0-rc.115" + } + }, + "node_modules/@effect/sql-d1": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/sql-d1/-/sql-d1-4.0.0-rc.115.tgz", + "integrity": "sha512-o2JkGjN02NBMxwDtJbwcC4teyMiOApqN085fdVMid4FUC6ixj/WyKyPpe51QGOMQQTTl2BkXccA/IwDIywGXlA==", + "license": "MIT", + "dependencies": { + "@cloudflare/workers-types": "^5.20260905.1" + }, + "peerDependencies": { + "effect": "^4.0.0-rc.115" + } + }, + "node_modules/@effect/sql-sqlite-do": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/sql-sqlite-do/-/sql-sqlite-do-4.0.0-rc.115.tgz", + "integrity": "sha512-7lH9h+w4DW2tI+dus4hEac5mSCy1wgiT+uw/VvjR8YhNDemd3zEFY03NkbD81ipfOpnu2QA1YwgM58ExyPlhug==", + "license": "MIT", + "peerDependencies": { + "effect": "^4.0.0-rc.115" + } + }, + "node_modules/@effect/vitest": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/@effect/vitest/-/vitest-4.0.0-rc.115.tgz", + "integrity": "sha512-DJR0hfdr3HNXAkzW8AzfvUz6VmrNFLrKk9tZGDURi33faMyxkc7ZewxELMMZwGpOTGN4mfqYVbX2CXgI+ZJBeQ==", + "license": "MIT", + "peerDependencies": { + "effect": "^4.0.0-rc.115", + "vitest": ">=5.0.0 <6.0.0" + } + }, + "node_modules/@electric-sql/pglite": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.4.3.tgz", + "integrity": "sha512-ichuWTgtd4mOM1G4SpyGJa5trT03lWbMypDV0fUXUCXg5hiHqVAz/bZyV68NqmkLB7WcYmj1RMJVSp8HV/v/ZQ==", + "license": "Apache-2.0" + }, + "node_modules/@electric-sql/pglite-socket": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.1.3.tgz", + "integrity": "sha512-LAciWM0M1dCL8hlsxu2venbVZcdxema0BtDfpWYVqr+Y468UADw0pFWidhKw1M8sfJ8rdLT71tjMmnirf/IZRQ==", + "license": "Apache-2.0", + "bin": { + "pglite-server": "dist/scripts/server.js" + }, + "peerDependencies": { + "@electric-sql/pglite": "0.4.3" + } + }, + "node_modules/@electric-sql/pglite-tools": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.3.3.tgz", + "integrity": "sha512-AlzLJTRJ8+UFgK8CmxIpyIpJ0+YaFw02IiOSdYrqxwPXdSyeIShz8aa9Tq+tYFXdPwcaMp/Fc80mQZ1dkOQ/wg==", + "license": "Apache-2.0", + "peerDependencies": { + "@electric-sql/pglite": "0.4.3" + } + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", + "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.8.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-freebsd-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "license": "Apache-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.3.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.11.3" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-webcontainers-wasm32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/sharp-wasm32": "0.35.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@libsql/client": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@libsql/client/-/client-0.17.4.tgz", + "integrity": "sha512-lYayFWasDV78A+TjlEhr6ubb3odBV6OHjb+wdp8VQcyWWAEIjuwbCHaraEUS4m4yWoo0BvZo96It4VdzZRmRWw==", + "license": "MIT", + "dependencies": { + "@libsql/core": "^0.17.4", + "@libsql/hrana-client": "^0.10.0", + "js-base64": "^3.7.5", + "libsql": "^0.5.28", + "promise-limit": "^2.7.0" + } + }, + "node_modules/@libsql/core": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@libsql/core/-/core-0.17.4.tgz", + "integrity": "sha512-LqF9gIvnJ38nmAH1y/ChizHqDO/MO1wLgA96XrraulEEbqXxLjleSH92YWTolbuJKgPUmGu4aJk9W3UnAcxLOQ==", + "license": "MIT", + "dependencies": { + "js-base64": "^3.7.5" + } + }, + "node_modules/@libsql/darwin-arm64": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/darwin-arm64/-/darwin-arm64-0.5.29.tgz", + "integrity": "sha512-K+2RIB1OGFPYQbfay48GakLhqf3ArcbHqPFu7EZiaUcRgFcdw8RoltsMyvbj5ix2fY0HV3Q3Ioa/ByvQdaSM0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@libsql/darwin-x64": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/darwin-x64/-/darwin-x64-0.5.29.tgz", + "integrity": "sha512-OtT+KFHsKFy1R5FVadr8FJ2Bb1mghtXTyJkxv0trocq7NuHntSki1eUbxpO5ezJesDvBlqFjnWaYYY516QNLhQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@libsql/hrana-client": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@libsql/hrana-client/-/hrana-client-0.10.0.tgz", + "integrity": "sha512-OoA4EMqRAC7kn7V2P6EQqRcpZf2W+AjsNIyCizBg339Tq/aMC7sRnzs3SklderhmQWAqEzvv8A2vhxVmWpkVvw==", + "license": "MIT", + "dependencies": { + "@libsql/isomorphic-ws": "^0.1.5", + "js-base64": "^3.7.5" + } + }, + "node_modules/@libsql/isomorphic-ws": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@libsql/isomorphic-ws/-/isomorphic-ws-0.1.5.tgz", + "integrity": "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==", + "license": "MIT", + "dependencies": { + "@types/ws": "^8.5.4", + "ws": "^8.13.0" + } + }, + "node_modules/@libsql/linux-arm-gnueabihf": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm-gnueabihf/-/linux-arm-gnueabihf-0.5.29.tgz", + "integrity": "sha512-CD4n4zj7SJTHso4nf5cuMoWoMSS7asn5hHygsDuhRl8jjjCTT3yE+xdUvI4J7zsyb53VO5ISh4cwwOtf6k2UhQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-arm-musleabihf": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm-musleabihf/-/linux-arm-musleabihf-0.5.29.tgz", + "integrity": "sha512-2Z9qBVpEJV7OeflzIR3+l5yAd4uTOLxklScYTwpZnkm2vDSGlC1PRlueLaufc4EFITkLKXK2MWBpexuNJfMVcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-arm64-gnu": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-gnu/-/linux-arm64-gnu-0.5.29.tgz", + "integrity": "sha512-gURBqaiXIGGwFNEaUj8Ldk7Hps4STtG+31aEidCk5evMMdtsdfL3HPCpvys+ZF/tkOs2MWlRWoSq7SOuCE9k3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-arm64-musl": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-arm64-musl/-/linux-arm64-musl-0.5.29.tgz", + "integrity": "sha512-fwgYZ0H8mUkyVqXZHF3mT/92iIh1N94Owi/f66cPVNsk9BdGKq5gVpoKO+7UxaNzuEH1roJp2QEwsCZMvBLpqg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-x64-gnu": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-x64-gnu/-/linux-x64-gnu-0.5.29.tgz", + "integrity": "sha512-y14V0vY0nmMC6G0pHeJcEarcnGU2H6cm21ZceRkacWHvQAEhAG0latQkCtoS2njFOXiYIg+JYPfAoWKbi82rkg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/linux-x64-musl": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/linux-x64-musl/-/linux-x64-musl-0.5.29.tgz", + "integrity": "sha512-gquqwA/39tH4pFl+J9n3SOMSymjX+6kZ3kWgY3b94nXFTwac9bnFNMffIomgvlFaC4ArVqMnOZD3nuJ3H3VO1w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@libsql/win32-x64-msvc": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/@libsql/win32-x64-msvc/-/win32-x64-msvc-0.5.29.tgz", + "integrity": "sha512-4/0CvEdhi6+KjMxMaVbFM2n2Z44escBRoEYpR+gZg64DdetzGnYm8mcNLcoySaDJZNaBd6wz5DNdgRmcI4hXcg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@manypkg/tools": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@manypkg/tools/-/tools-2.1.2.tgz", + "integrity": "sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jju": "^1.4.0", + "tinyglobby": "^0.2.13", + "yaml": "^2.9.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "devOptional": true, + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@mrleebo/prisma-ast": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@mrleebo/prisma-ast/-/prisma-ast-0.13.1.tgz", + "integrity": "sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==", + "license": "MIT", + "dependencies": { + "chevrotain": "^10.5.0", + "lilconfig": "^2.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.6.tgz", + "integrity": "sha512-mRyDmEw9/fCDXCGfL1sbgIw/GUK0PVxRW4YwgPN61F3LQ+fSyoBFarJVzgGyhF6kRzEQZ0FejDqm4WLXSeqQmw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=23.5.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1 || 2.0.0-beta.2", + "@emnapi/runtime": "^1.7.1 || 2.0.0-beta.2" + } + }, + "node_modules/@neon-rs/load": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@neon-rs/load/-/load-0.0.4.tgz", + "integrity": "sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==", + "license": "MIT" + }, + "node_modules/@next/env": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.4.2.tgz", + "integrity": "sha512-nTUTFH7G5/J/fmpkjVLegOkqyKOP0CEsJcMsyO4UCYeN1su+YMW/MfaSErnJskL7XM+UDK6aTvslxsRCyya/sA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.4.2.tgz", + "integrity": "sha512-gCTWlw0e+Y6kajpFyKKgA195jUJCRhlzJE0lV7ufe8a+ghIsANWZ0/FiJwg6DuOG1+OvRbcZDcFBoRh3mNJx0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "4.9.1", + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.4.2.tgz", + "integrity": "sha512-ONkhFvZNFWlsEHOM/81AtxdyuJP2KRYKYR0JxPwvcu1AuPMMMgcL+wW2luldJvMtZwKtUxoSkCychW5wIeoYSw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.4.2.tgz", + "integrity": "sha512-luPCMbOsCoaF+kXJEUjmjmOZg1lC3BflhmUu+ZmW4tBu2vW/4AXak8JBFvePizGkxVmNiAw/r9ra+6UviCWtWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.4.2.tgz", + "integrity": "sha512-xhwFTAncJyaCNy5KqKKuKaIIdCy1/1ZV1s5S1G0hhT7wGMkDTlfJ6aQbfRFnIG/s3/kDrxQ8aycVe+c5QnP8ow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.4.2.tgz", + "integrity": "sha512-T1PNmfbPcxr5ndtWUL/3wQtLXsz808lq6sc2GrNT5k2oquF7UyqZddHSuAewHVsWsGXe6nsl9HoN1YNriVjuSg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.4.2.tgz", + "integrity": "sha512-N9cDUOCGtkJG5PNKDFZUF3xXndrJJcpLp121uAGjIGvO/U2p9tfdNOM9htj7+5f72l0m8rMw/cvYacUJBQoudg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.4.2.tgz", + "integrity": "sha512-yY2uh1YhX6ufuYy2FCbw1dqblbhI57GLYAJfCkqD9auTv6pLrH67Uccjc3QMKBeCYAG6lkgu08ExmX1bbjejjQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.4.2.tgz", + "integrity": "sha512-j/ArWRIHpMMB6wYLMhr2puTguBt70lNU/Cmjl9p6dTDE8DGknYJMP9PdwPk2dqpCNL/KIX9yfngDvIesxJPmsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.4.2.tgz", + "integrity": "sha512-AA4edyWHDko3NCSo0x6GomsdgFb0oR1J3MXU1b5xt6FRFg4AucrMPW3S0hCe/9onU0O1BbpGQBsqo1r0Gneu1g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@noble/hashes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.4.0.tgz", + "integrity": "sha512-X5XaVWZIBCT7HHZGm5I7ZQXDwLG+bGXuSrMQAW+7Zvl87h1kmc1ZB1VSRJcpUfoUrGQp4Fkoxm5kZ+Ms+aW+eA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@nodable/entities": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-3.1.0.tgz", + "integrity": "sha512-LsS/DjHr+uDM647Gru/cA8+J3a3HfhttwCKLyuoyN7yXTFCxKBtSgMQBvrW9yNPa2/zDRUNuGPaH5QUFoa4arQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@octokit/auth-token": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", + "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/core": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.8.tgz", + "integrity": "sha512-L7y8eYc+AwxGr2PWI4WFt1VG4TiJ66c26BD16mXpYIlXxG0SMigM1+m4aTSlYyBr5BlQsGAlz8uDCoZN4SEMcg==", + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^6.0.0", + "@octokit/graphql": "^9.0.5", + "@octokit/request": "^10.0.16", + "@octokit/request-error": "^7.1.2", + "@octokit/types": "^18.0.0", + "before-after-hook": "^4.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/endpoint": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.5.tgz", + "integrity": "sha512-iXa654H3yFafF/ieHkukfbgWo2rmXD2ceD0ZOtrPhw1bc3FDch1d9N/TNs0FQ1/cIbwb7kspUX8jzIs8nzb9DQ==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^18.0.0", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/graphql": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.5.tgz", + "integrity": "sha512-bt/hm03LeU6Vy7FwTrkkC9p3XGT/lBwClglMqxBSe5/q0E5CdJTXeAqEI0vlw89/LF/G6tryTIH8HirZ3prMVg==", + "license": "MIT", + "dependencies": { + "@octokit/request": "^10.0.16", + "@octokit/types": "^18.0.0", + "universal-user-agent": "^7.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "29.0.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-29.0.1.tgz", + "integrity": "sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==", + "license": "MIT" + }, + "node_modules/@octokit/openapi-webhooks-types": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-12.1.0.tgz", + "integrity": "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz", + "integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", + "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz", + "integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^16.0.0" + }, + "engines": { + "node": ">= 20" + }, + "peerDependencies": { + "@octokit/core": ">=6" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz", + "integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==", + "license": "MIT" + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz", + "integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^27.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "10.0.16", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.16.tgz", + "integrity": "sha512-A0zWGjHzISIb+9ccG8s0dq7LKO5zVpJLRICjgUb+sJxEWqn8RUHB1rD3AE51+PECvXHIxqZ1VVvs4fHTSD9nUQ==", + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^11.0.5", + "@octokit/request-error": "^7.1.2", + "@octokit/types": "^18.0.0", + "content-type": "^3.0.0", + "json-with-bigint": "^3.5.12", + "universal-user-agent": "^7.0.2" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/request-error": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.2.tgz", + "integrity": "sha512-XZRuT3xZ84D3gYErI1DZvhJ33dCWVV6uzBtWkaBB4TvA/L6eOeTZodxLFVB44bBEEo3vEx7y00UfX1tBLrtLRg==", + "license": "MIT", + "dependencies": { + "@octokit/types": "^18.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/rest": { + "version": "22.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.1.tgz", + "integrity": "sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==", + "license": "MIT", + "dependencies": { + "@octokit/core": "^7.0.6", + "@octokit/plugin-paginate-rest": "^14.0.0", + "@octokit/plugin-request-log": "^6.0.0", + "@octokit/plugin-rest-endpoint-methods": "^17.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-18.0.0.tgz", + "integrity": "sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^29.0.1" + } + }, + "node_modules/@octokit/webhooks": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-14.2.0.tgz", + "integrity": "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw==", + "license": "MIT", + "dependencies": { + "@octokit/openapi-webhooks-types": "12.1.0", + "@octokit/request-error": "^7.0.0", + "@octokit/webhooks-methods": "^6.0.0" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/@octokit/webhooks-methods": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-6.0.0.tgz", + "integrity": "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ==", + "license": "MIT", + "engines": { + "node": ">= 20" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@prisma/cli-engine": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@prisma/cli-engine/-/cli-engine-0.7.0.tgz", + "integrity": "sha512-CL21NYQQEAR9IEApPfUzMhv/VtbsJs4efRSxlvzHoFT69vynr0Wuu5KNNbZgIlONOEfULqP0djFCD4VaA/HVPg==", + "license": "Apache-2.0", + "dependencies": { + "@clack/prompts": "1.5.0", + "@stricli/core": "1.3.0", + "arktype": "^2.2.7", + "c12": "3.3.4", + "colorette": "^2.0.20", + "package-manager-detector": "1.8.0", + "string-width": "^8.2.1" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "@prisma/management-api-sdk": "^1.55.0" + } + }, + "node_modules/@prisma/composer": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@prisma/composer/-/composer-0.29.1.tgz", + "integrity": "sha512-g9iyBsYNHKJXEo2bCd7er46rlP015vHlSVV8Qwexo/X55zclv4IYWjGVctA0ugoeTllCy5/dBb6K22Z8Dpf+Mw==", + "license": "Apache-2.0", + "dependencies": { + "@effect/sql-d1": "4.0.0-rc.115", + "@effect/sql-sqlite-do": "4.0.0-rc.115", + "@effect/vitest": "4.0.0-rc.115", + "@prisma/management-api-sdk": "^1.80.0", + "@standard-schema/spec": "^1.1.0", + "alchemy": "2.0.0-beta.78", + "arktype": "^2.2.3", + "cross-spawn": "^7.0.6", + "effect": "4.0.0-rc.115", + "esbuild": "^0.28.1" + }, + "engines": { + "node": ">=22.18.0" + } + }, + "node_modules/@prisma/composer-cli": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@prisma/composer-cli/-/composer-cli-0.29.1.tgz", + "integrity": "sha512-59e2vWCLF8Y3pTJhAHZofww8bmVWKdgr9u8ALk8nVMrSbNIDGhND/UccBa03KX6tQvCiBtbhEtpmxv5Db3kM+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/composer": "0.29.1", + "alchemy": "2.0.0-beta.78", + "cross-spawn": "^7.0.6", + "effect": "4.0.0-rc.115", + "esbuild": "^0.28.1" + }, + "engines": { + "node": ">=22.18.0" + }, + "peerDependencies": { + "@prisma/cli-engine": "0.7.0" + } + }, + "node_modules/@prisma/composer-prisma-cloud": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/@prisma/composer-prisma-cloud/-/composer-prisma-cloud-0.29.1.tgz", + "integrity": "sha512-wp3PxvKxp0EwwSi/9Vr/M4V66x47uaMK8wQEb32E6SYXMRJvuNKhsakdvWQiA2r23KMQWH0qEFQcq6KiUPt0nw==", + "license": "Apache-2.0", + "dependencies": { + "@distilled.cloud/prisma": "1.0.0-rc.12", + "@effect/platform-bun": "4.0.0-rc.115", + "@effect/platform-node": "4.0.0-rc.115", + "@effect/platform-node-shared": "4.0.0-rc.115", + "@prisma/composer": "0.29.1", + "@prisma/dev": "^0.25.2", + "@prisma/management-api-sdk": "^1.80.0", + "@prisma/orm-toolchain": "8.0.0-rc.17", + "@standard-schema/spec": "^1.1.0", + "alchemy": "2.0.0-beta.78", + "arktype": "^2.2.3", + "effect": "4.0.0-rc.115", + "jose": "^6.1.3", + "pathe": "^2.0.3", + "pg": "8.22.0", + "tsdown": "^0.22.7" + }, + "engines": { + "node": ">=22.18.0" + }, + "peerDependencies": { + "@prisma/orm-postgres": "8.0.0-rc.17" + } + }, + "node_modules/@prisma/compute-sdk": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@prisma/compute-sdk/-/compute-sdk-0.43.0.tgz", + "integrity": "sha512-q5Tf5hpDFZmcS4eNeH7IU8OnavToP9h4NsrDXjW7uIZf/pjaQIWItQJi9DZHPkH8n/SvT/oHQrmzPsJ9NPW/hg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@vercel/nft": "^1.10.2", + "better-result": "^2.7.0", + "jiti": "^2.7.0", + "magicast": "^0.5.3", + "picomatch": "^4.0.4", + "tar-stream": "^3.1.8", + "tiny-invariant": "1.3.3", + "ws": "^8.20.0", + "yaml": "^2.8.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@prisma/management-api-sdk": "^1.69.0" + } + }, + "node_modules/@prisma/debug": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-7.2.0.tgz", + "integrity": "sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/dev": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.25.2.tgz", + "integrity": "sha512-igVDlzGSEd/bGutlkh3fXHqXlOkaIHSt+Vpjdo0BrxJ1/wAlDSyntKLqKVNGr2zy22bLVO3majebWZUKINXwdA==", + "license": "ISC", + "dependencies": { + "@electric-sql/pglite": "0.4.3", + "@electric-sql/pglite-socket": "0.1.3", + "@electric-sql/pglite-tools": "0.3.3", + "@prisma/get-platform": "7.2.0", + "@prisma/query-plan-executor": "7.2.0", + "@prisma/streams-local": "0.1.11", + "find-my-way": "9.7.0", + "foreground-child": "3.3.1", + "get-port-please": "3.2.0", + "pathe": "2.0.3", + "proper-lockfile": "4.1.2", + "remeda": "2.33.4", + "std-env": "3.10.0", + "valibot": "1.4.2", + "zeptomatch": "2.1.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/@prisma/get-platform": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-7.2.0.tgz", + "integrity": "sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "7.2.0" + } + }, + "node_modules/@prisma/management-api-sdk": { + "version": "1.85.0", + "resolved": "https://registry.npmjs.org/@prisma/management-api-sdk/-/management-api-sdk-1.85.0.tgz", + "integrity": "sha512-vFIq2mYQCtaqEqDWssdH3LDr1scCa1kA1uGrBXeEC0nSi6Eu9OAxONz0zcZuZtKOUCYHIouKzUMfsGHJ3KZswQ==", + "license": "Apache-2.0", + "dependencies": { + "openapi-fetch": "0.14.0" + } + }, + "node_modules/@prisma/orm-family-sql": { + "version": "8.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@prisma/orm-family-sql/-/orm-family-sql-8.0.0-rc.17.tgz", + "integrity": "sha512-KbdapnNyIX44hwgxvBV9Zl8qjIbYAm6VgM7uW7u6fDlx1QP41L7s5INxaADdoceqgWTo/KUqVKLpMq7RcGByzg==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/orm-framework": "8.0.0-rc.17", + "@prisma/orm-toolchain": "8.0.0-rc.17", + "@standard-schema/spec": "^1.1.0", + "arktype": "^2.2.2", + "pathe": "^2.0.3", + "pluralize": "^8.0.0", + "tinyglobby": "^0.2.17", + "ts-toolbelt": "^9.6.0" + }, + "peerDependencies": { + "typescript": ">=5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/orm-framework": { + "version": "8.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@prisma/orm-framework/-/orm-framework-8.0.0-rc.17.tgz", + "integrity": "sha512-KfircGILFXGoBPPg6I4caNF/tpVe+2UF6kMO+PF/KfOwMsFh11mR5nEijiSqy+5l7oVWGsT0GNz2inysbg+UWg==", + "license": "Apache-2.0", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "arktype": "^2.2.2", + "pathe": "^2.0.3", + "tinyglobby": "^0.2.17", + "uniku": "^0.5.0" + }, + "peerDependencies": { + "typescript": ">=5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/orm-postgres": { + "version": "8.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@prisma/orm-postgres/-/orm-postgres-8.0.0-rc.17.tgz", + "integrity": "sha512-1jwZH/APF9222PFufvvcBoQXcfEXjmXjqJ1uEU7PMUaxHbL1FwwDcFxHmjujSt9mFOopGSvr5b5BkIjNWbUinw==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/orm-family-sql": "8.0.0-rc.17", + "@prisma/orm-framework": "8.0.0-rc.17", + "@prisma/orm-target-postgres": "8.0.0-rc.17", + "@prisma/orm-toolchain": "8.0.0-rc.17", + "@types/node": "26.1.2", + "@types/pg": "8.20.4", + "arktype": "^2.2.2", + "pathe": "^2.0.3", + "pg": "8.22.0", + "tinyglobby": "^0.2.17" + }, + "peerDependencies": { + "temporal-polyfill": "^1.0.4", + "typescript": ">=5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/orm-postgres/node_modules/@types/node": { + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@prisma/orm-postgres/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "license": "MIT" + }, + "node_modules/@prisma/orm-target-postgres": { + "version": "8.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@prisma/orm-target-postgres/-/orm-target-postgres-8.0.0-rc.17.tgz", + "integrity": "sha512-SAE42aFV8ulzNmkJFKk16zVa3CxjTroGllBTkGBgnC2zEiNnBebIXHo7DmSWC70iMM6qFSDL0g2pmwAMwDIGEg==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/orm-family-sql": "8.0.0-rc.17", + "@prisma/orm-framework": "8.0.0-rc.17", + "@prisma/orm-toolchain": "8.0.0-rc.17", + "@standard-schema/spec": "^1.1.0", + "@types/node": "26.1.2", + "@types/pg": "8.20.4", + "arktype": "^2.2.2", + "pathe": "^2.0.3", + "pg": "8.22.0", + "pg-cursor": "^2.21.0", + "postgres-array": "2.0.0" + }, + "peerDependencies": { + "temporal-polyfill": "^1.0.4", + "typescript": ">=5.9" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/orm-target-postgres/node_modules/@types/node": { + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@prisma/orm-target-postgres/node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "license": "MIT" + }, + "node_modules/@prisma/orm-toolchain": { + "version": "8.0.0-rc.17", + "resolved": "https://registry.npmjs.org/@prisma/orm-toolchain/-/orm-toolchain-8.0.0-rc.17.tgz", + "integrity": "sha512-iG1knDO9Hg1/b5NOj74T7Bx5d2imJVq+qSrKDD94nwjOyvIZ5ygKSzVq2hb0KoAjae8PONgznSOBRMA8Kh+p4Q==", + "license": "Apache-2.0", + "dependencies": { + "@prisma/orm-framework": "8.0.0-rc.17", + "@vercel/detect-agent": "^1.2.4", + "arktype": "^2.2.2", + "c12": "^3.3.4", + "ci-info": "^4.3.1", + "clipanion": "4.0.0-rc.4", + "closest-match": "^1.3.3", + "colorette": "^2.0.20", + "esbuild": "^0.28.2", + "jsonc-parser": "^3.3.1", + "package-manager-detector": "^1.8.0", + "pathe": "^2.0.3", + "prettier": "^3.9.6", + "string-width": "^8.2.2", + "strip-ansi": "^7.2.0", + "tinyglobby": "^0.2.17", + "vscode-languageserver": "10.1.0", + "vscode-languageserver-textdocument": "1.0.12", + "wrap-ansi": "^10.0.0" + }, + "peerDependencies": { + "@prisma/cli-engine": "0.7.0", + "typescript": ">=5.9", + "vite": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@prisma/query-plan-executor": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@prisma/query-plan-executor/-/query-plan-executor-7.2.0.tgz", + "integrity": "sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==", + "license": "Apache-2.0" + }, + "node_modules/@prisma/streams-local": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@prisma/streams-local/-/streams-local-0.1.11.tgz", + "integrity": "sha512-0TcebL559MByKqTJ+SsrFIEg228iw8UCVRFckzgfRSiJqczhs+MuAgWOF9lnOIV/IVqvu+KMnFTH0eDeTQMpUg==", + "license": "Apache-2.0", + "dependencies": { + "ajv": "^8.12.0", + "better-result": "^2.7.0", + "env-paths": "^3.0.0", + "proper-lockfile": "^4.1.2" + }, + "engines": { + "bun": ">=1.2.0", + "node": ">=22.0.0" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-3.2.6.tgz", + "integrity": "sha512-MJP29gVoHznmqmwhH1tlZqzfeQ3aylTpSSa6WKZXtkwYUH02i9imBmWGTyZrbnAou5paX78SE4jMAUqnEPf8ug==", + "license": "Apache-2.0", + "dependencies": { + "modern-tar": "^0.8.6", + "yargs": "^18.0.0" + }, + "bin": { + "browsers": "lib/main-cli.js" + }, + "engines": { + "node": ">=22.12.0" + }, + "peerDependencies": { + "proxy-agent": ">=8.0.1", + "yauzl": "^2.10.0 || ^3.4.0" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + }, + "yauzl": { + "optional": true + } + } + }, + "node_modules/@quansync/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==", + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.2.0.tgz", + "integrity": "sha512-KABY+VMIRPJL+Vyzv/335FEhXXD/xDv8BMb1kl48/aXJZMH0LtHCTx5ga5RnxaEP3nZHtmTLf1P9vanmFX46bw==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.17.tgz", + "integrity": "sha512-67jjcVvxjXCCStnTW3Z+M7jmaFMuMR7M2JgpDzH4w7JSRrikmzhjfYgP/09ECb8n7whnsgh1ifJ+Ie96qEj+pQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.2.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.2.0.tgz", + "integrity": "sha512-+yiQzqcc7Sy7/5s0jrMCjpPRFB3538VNrXPWdTLZhE/SCfgEws4aI6lHWN/vvcnyhHndROWBzqmqB4QBrITZ9Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.3.0", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-slot": "1.5.0", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.5.tgz", + "integrity": "sha512-+48PbAAbq3didjJxa+OaWY2ZwgAKsNiRGyeHKszblZMQ+kcpd9pAaT11cMkGEie0vsOi3QdeTE6d5Fe3Gn61kA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.3.0.tgz", + "integrity": "sha512-v5AYEocMISkbJ+1fTXzZpiFv7NRr3D2WiYbLIKf+FkmJ8VkP6d503eV2n34MFussHXY1pcoq3yfJiQH77dc4Mg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.2.0.tgz", + "integrity": "sha512-FtRA52a/r+LKStFT+neLUm+8vSe7wbzkbQGGeU8ixFiwC8NU14Evoq9ATECqL3eGbcUzJR4fyfA4KkK/q6dfqg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.2.1.tgz", + "integrity": "sha512-KIfDcAsx+oVylFZ4xryVKusJUrLLhTQmfnJW4kwk4Km5myvhHCrj04hnWWUC166+xD4DHdH8tQGylwYX1h6+Pg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.2.0", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-use-callback-ref": "1.1.5", + "@radix-ui/react-use-effect-event": "0.0.5" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.2.0.tgz", + "integrity": "sha512-MPm5R0iRGUDrDnPNxmLBkv+X7pN4XKzt+MbWJEuJQsH3NFH4omrbpXpucyYCCKTSt+na/ZxGhEWQrWTZ0285cA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.3.1.tgz", + "integrity": "sha512-ugeMhbXt4y5S2T1GnIqbWDKEN962PDwnX1fN0eKOOgf5f63Dh2mn8F1FUySlgW0iF6GiVsRF32DzuDIWTUyQJg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-use-callback-ref": "1.1.5" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.4.tgz", + "integrity": "sha512-TMQp2llA+RYn7JcjnrMnz7wN4pcVttPZnRZo52PLQsoLVKzNlVwUeHmfePgTgRluXFvlD3GD5g5MOVVTJCO0qA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.3.1.tgz", + "integrity": "sha512-ZNxvXRx5W2Wos4fXCXb5lpdqN0Z5chf+mStOUOTr4ik7d+62MRvoe9rzCA/eGNg36lxXqSrKEKmwuZEcUrIstw==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.2.0", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.3.0", + "@radix-ui/react-dismissable-layer": "1.2.1", + "@radix-ui/react-focus-guards": "1.2.0", + "@radix-ui/react-focus-scope": "1.3.1", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-popper": "1.4.0", + "@radix-ui/react-portal": "1.2.0", + "@radix-ui/react-presence": "1.1.11", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-slot": "1.5.0", + "@radix-ui/react-use-controllable-state": "1.3.0", + "@radix-ui/react-use-layout-effect": "1.1.4", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.7.2" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.4.0.tgz", + "integrity": "sha512-yCWRvLeGv9Pz3+efwHqGPp70mZ56r3kfIgQVF56Oj2aAa4uP/Tb+IE59wNcc+758rctqbCKx4LbK8II/r7Bn0Q==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.17", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.3.0", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-use-callback-ref": "1.1.5", + "@radix-ui/react-use-layout-effect": "1.1.4", + "@radix-ui/react-use-rect": "1.1.4", + "@radix-ui/react-use-size": "1.1.5", + "@radix-ui/rect": "1.1.3" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.2.0.tgz", + "integrity": "sha512-StX7xXnaRU41VvFtMm9zlhVGz8XF6GmWWTXftkQaY+tqVkbs/R9UmAp5mLzHHapk5hM9RMZQvO/3usyIP/g42g==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.11.tgz", + "integrity": "sha512-Z7/atlkab36Z8hm+V8zYc79r0W+tiOB1o0tun1By94JyadkekLQmtEAnBSP9XKXBNQsStoStS4+gX10JpS5akA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.2.0.tgz", + "integrity": "sha512-HCTSPMNqv55Qk0IX4geJbpyXazmqulcimwuyjxTkKi29v+QZbG2Zho9BnbBq4YS2PF+KlNb2CXoLz66uUmblkg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.5.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.2.1.tgz", + "integrity": "sha512-UwraORzVUeEPMclhO1p0vz0qI+TbdDLO9i+FiOqhJyHKwdpCRCck9yVEscUnAMIzCiuNoQa8D4A9bIpOPXGt6Q==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.2.0", + "@radix-ui/react-collection": "1.2.0", + "@radix-ui/react-compose-refs": "1.1.5", + "@radix-ui/react-context": "1.3.0", + "@radix-ui/react-direction": "1.2.0", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-use-callback-ref": "1.1.5", + "@radix-ui/react-use-controllable-state": "1.3.0", + "@radix-ui/react-use-is-hydrated": "0.1.3", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.5.0.tgz", + "integrity": "sha512-tyYd9ddPXAysAbdbD9eYxgwpCSv6f3PncqVSNKQFSR5lcJVLz3cb/pANDoYrLiHBpXv7skortyUgGUWsYuPPFQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.5" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.2.1.tgz", + "integrity": "sha512-hRoJlode+hg5ZNlR+3tkfkUliIybdTpD5lkAvHQ9yaXseGf7XVO9Ib2GPEIOuaJJbo7YWYbNpDDRfo8Dhf6/xA==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.2.0", + "@radix-ui/react-context": "1.3.0", + "@radix-ui/react-direction": "1.2.0", + "@radix-ui/react-id": "1.1.4", + "@radix-ui/react-presence": "1.1.11", + "@radix-ui/react-primitive": "2.2.0", + "@radix-ui/react-roving-focus": "1.2.1", + "@radix-ui/react-use-controllable-state": "1.3.0" + }, + "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 + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.5.tgz", + "integrity": "sha512-Y5GBf4NKeADoXI1geiMlMuMoURT3k9MizzzKhGb/m55H94aGigZ01PIpkvsO6lML13BA6XYAXSJ6gza7vTn5nw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.3.0.tgz", + "integrity": "sha512-TAcBI7bw2ljYCbv4+zuTSd6zICu8pRt6SDN2vJ/Z06K2MXh6I9WYFe/A9ovlFDtR5HVHGm5iDxDoABm/++dbKg==", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.2.0", + "@radix-ui/react-use-effect-event": "0.0.5", + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.5.tgz", + "integrity": "sha512-7cshFL8HGS/7HEiHH+9kL9HBwp2sa9yX18Knwek6KYWmXwM7pegMgta2AXMQKI+rq3JnfSj9x8wYqFMTdG1Jgg==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-is-hydrated/-/react-use-is-hydrated-0.1.3.tgz", + "integrity": "sha512-umO/aJ+82CpOnhDZUTbILCQf7kU/g0iv+oGs/Q8jw7IkhWBzaEP4sA268PhFAJTFetbwp3ICc6ktpI4TqtxcIw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.4.tgz", + "integrity": "sha512-K20DkRkUwDnxEYMBPcg3Y6voLkEy5p5QQmszZgLngKKiC7dzBR/aEuK3w1qlx2JWDUNH6FluahYdgR3BP+QbYw==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.1.4.tgz", + "integrity": "sha512-cSOCh6JlkmfjLyNcLiu2nB4v+nm+dkZ+Q5KHWk/soo4U7ZLiEQFKHK9/YmtBHjfCEaU43IBKQOc4/uJmCaiCTQ==", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.1.5.tgz", + "integrity": "sha512-V1McDQkMGzgivwqdu7u96APs7oi0Jvj9LTzgq3WWrDZqxWdAqU9yZnZQqk5OizGFR8badUQwZsrlao7MOlWYOA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.4" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.1.3.tgz", + "integrity": "sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==", + "license": "MIT" + }, + "node_modules/@redis/bloom": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-6.3.0.tgz", + "integrity": "sha512-NQ5poYpZr0jv6zazN1cy6JY5kIipKFZ3R9GTL4kOUTX3a9YAfY29U8bsE4lWhVQEM+G4V0BXVC57mubIdDijeA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@redis/client": "^6.3.0" + } + }, + "node_modules/@redis/client": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-6.3.0.tgz", + "integrity": "sha512-fHrjwGCBvAANGi+TuRuwKi83sIOzgHr8eh+Uf48w3fSX7Hhrz174NrWqfJhAC2vnN0d/tfaZpdr6+o6JC3QHwg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@node-rs/xxhash": "^1.1.0", + "@opentelemetry/api": ">=1 <2" + }, + "peerDependenciesMeta": { + "@node-rs/xxhash": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@redis/json": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-6.3.0.tgz", + "integrity": "sha512-yt6vRfPBXtW/3qm53cF81TSQpLMjWdW4/2E9WQ2GgbvsKkuCKCFQIcMiKlil1ZMnezK+IQuS795xKU5psbaegw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@redis/client": "^6.3.0" + } + }, + "node_modules/@redis/search": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-6.3.0.tgz", + "integrity": "sha512-RPXAZmKjZZG7Tm7m1w9keFdXzbL91PiSHQBfQRe9xwW40jNsTRbG0FwhIz4QlHPU4gKDAsCy8IQHj4yZl4H9rw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@redis/client": "^6.3.0" + } + }, + "node_modules/@redis/time-series": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-6.3.0.tgz", + "integrity": "sha512-+fJOB8mN1z5WRakCJNh5lVdz1KqvHGSOistsKeitD24QsCtPwyRQXWC0iq6T/i/ubLE/YcguZqPm8F598MKk4A==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 20.0.0" + }, + "peerDependencies": { + "@redis/client": "^6.3.0" + } + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.5.1.tgz", + "integrity": "sha512-P9ZvnfouRu4MSC+ilERaw6FmZs8zqKhpHxEs4aGDGWQAMzQGXnhvCSvoNwokfNvdt7t3Y5Y4p6gStQgezeIqug==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@smithy/core": { + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.37.0.tgz", + "integrity": "sha512-97imTcCyiPd8k0e9+ts/Sp0W65Dn9Ti357J7M09Ov4tI8Q1JDJVFSoAJtjEVKqfHEr3Pdo2jfolqKCaaiszH0g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.5.2.tgz", + "integrity": "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.33.2", + "@smithy/types": "^4.17.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.8.0.tgz", + "integrity": "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.33.3", + "@smithy/types": "^4.18.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.13.0.tgz", + "integrity": "sha512-/GGcPoNJ2nzGytdAanpbx7mpp9Coa8LP+/Rpmbktr8YeLuIXs9B0SEz+X3AeonHdyzOIFJdKbN7jOZ+Tj+pMGw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.37.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.7.2.tgz", + "integrity": "sha512-XsIDj5gVG4YRxGS4n4TiBDAogPWRHXKZyor6JW/sEuaa/7BvKADe9j45jI2dPYCnYbKkLBmbZ4qN9ns0sH+kMQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.33.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.7.4.tgz", + "integrity": "sha512-tHy0K0VtqNd5Y7Y41h0a0Lhh0L1GzC08dTWg0F7vRJWFtTENg7IZikf3wQkanYIRdb7ngoIPMTmqgUi401fEeQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.35.0", + "@smithy/types": "^4.19.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.19.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.19.0.tgz", + "integrity": "sha512-r7jh49VJxGerfAcTQA6gXcKc+98zOp/tqRwzYjgOE+iSQsP6cEU1hq2QzbuipmP68QtYdY9wKEhiCQZIzHgZ4Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.6.2.tgz", + "integrity": "sha512-wTQX1hPfElIqY6AzM/s6c4UgpMxCL4MwJ5u6340ksLPq78lur6Y+keheIDk5gMX4G3KFh4MERcDt6xhRq+ie1Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.33.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@stricli/core": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@stricli/core/-/core-1.3.0.tgz", + "integrity": "sha512-LnBe2HntygaLDU5trtjiC3J4C/YkmIZuM0XB52IF4qaLqJH09kgD1fnZiS2gaYUnt0nAN2a+1b4PSOBcfPrN4Q==", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.4.tgz", + "integrity": "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.164", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.164.tgz", + "integrity": "sha512-XOnrazWcOd6yWPnR7DxqCBPPYciDjHq+NN8LPwwqBCJNXLyPJgKo47fZpJ113+oyAn9Zti0Cf6H4k6yPcE3WFg==", + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.5.tgz", + "integrity": "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg==", + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/pg": { + "version": "8.20.4", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.20.4.tgz", + "integrity": "sha512-Jz7UDOlIiFJuacC0TlBoLyNtmwlA/wpIyPDd3tvUqlRM+HzkWy2xUgpFpaXtbfTAFF6sIGq5lsCDBdJnhky1Xg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.2.tgz", + "integrity": "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.72.1.tgz", + "integrity": "sha512-5CokTWXpmbylfFabsbvHC0CAw3XLaGnoa+nFJX5FR592h/LoZsENUE6p/rg5xvkKrFEXz6pYmgI29AgXc2N3BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/type-utils": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.72.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.14.tgz", + "integrity": "sha512-wCBiZ77u1tuWde6G/nfOtLaCTYcFDU5yCzARzK10y+rLhzYoL7a7yEemcopcc2Mzow7gZOIjnV2ym1NYmdiJOQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.72.1.tgz", + "integrity": "sha512-ZGwZP4OCfyA0AQTpEAMWz+rtX01DRhQWW5hB0ucKDEIX5U7jdmPSaMx94rQfaPAQzIYz2BimOgKOJtjfpRFQ9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.72.1.tgz", + "integrity": "sha512-fAuVMkwdO/huI8nyo/WKnNKf6Gag93S56Rh3Ts5mGcavwSdaN8tRg1gCeIGX8PF+nzp1BjGfO4gHhGzW1J6jTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.72.1", + "@typescript-eslint/types": "^8.72.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.72.1.tgz", + "integrity": "sha512-lC/t6eMCZZQAAKZEYGL6RDVSuFehpdmMT6h+nJIjIa6oylN/PwDgDVtEIbB7O9xFfZYtZAYLoLlDNWKJhtF+uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.72.1.tgz", + "integrity": "sha512-e4D5R5vpeAEPBxT2BAzsFQL3sbwyeeeo5+aczgNSRK1V734jE7pTqaGFU+fXapWEQwnZbpFaTn32+Z8DwS6OTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.72.1.tgz", + "integrity": "sha512-iY2wlmyrXJmx4yxUGP3aYCFF3cA/6ShddOKmLU2dx7LnEykbAM8WThlxZEfd1NddqceF6eJmZUayxx9oKIYNlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.72.1.tgz", + "integrity": "sha512-LmE5IhQet1BWOWEXqBrVtBPsMAOQ6Nzk35d+WLh3mk4EUF33sqlfxjio1MdYeSvKSG5skactKKuixBIKXhL4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.72.1.tgz", + "integrity": "sha512-DAlUoUV93hIvrtIQLwCbmZQYVZwOMhiHJrOVUUIWicFZaIYjTRqlY3I/NZevfkLmSqkNHRu2qYDcq9lrn16oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.72.1", + "@typescript-eslint/tsconfig-utils": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/visitor-keys": "8.72.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.72.1.tgz", + "integrity": "sha512-5v5liypurJBFHCBNqh/RjsymAD+VWcE0djuGY/BUqp5fC3Qn+luWDEksjuTtWjPn6i5zQlUtkZCRG/CYG0yCkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.72.1", + "@typescript-eslint/types": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.72.1.tgz", + "integrity": "sha512-SB8xqipSzZHUePCCLNeYxqnxq83X61/qzNhjQGbTfjxGZIeOEP7tBgWYX05Tcd6CgE02WdTJnh5b8kMZJ/+bnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.72.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/detect-agent": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@vercel/detect-agent/-/detect-agent-1.2.7.tgz", + "integrity": "sha512-5tWaC9V+u4SHcSMKBz9FQb3Dhl/1A2lQ6QqHovu8uQeb8dTyjEevpJMANm/uQEn/usYB63fpdjWYjkJ8/bGtjA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@vercel/nft": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.11.0.tgz", + "integrity": "sha512-m1QFg+U+3yPOnP1xSYJ73UIRxLOXdts1JOhiOiyPYqEsALgrXFFINvgUaD6R6iNvaBFAjHllBCbkfx4FuOdpaA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.4", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vitest/mocker": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.5.tgz", + "integrity": "sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.5", + "estree-walker": "^3.0.3", + "magic-string": "^1.4.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9 || ^3.0.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.4.tgz", + "integrity": "sha512-jQz9sVhrZuphH4NrAIHSgkDJCluQO7Ioi4KGRLa7aTUjAODQ13hENX0YIytqYE/rIkO485gQG2LeBxJaW53kkQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/@vitest/spy": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.5.tgz", + "integrity": "sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==", + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@yuku-codegen/binding-android-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-android-arm64/-/binding-android-arm64-0.8.7.tgz", + "integrity": "sha512-C/0zV5IhgVdYhGJTwrY0v8dknxlhiKwtVJkMUaexu9/QvRmzlV4vfU3hZlUSgqc2BxQHntL1mCVbDq8j0FRFDw==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-codegen/binding-darwin-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-arm64/-/binding-darwin-arm64-0.8.7.tgz", + "integrity": "sha512-/u+REDMI4a0/lsJXTM4c53/w31OGZLOReZIyg62uhgLs0kc8NHsj/nOcxTdlQjq5gi0zhdkccD9LaLTXcdzPvw==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-darwin-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-darwin-x64/-/binding-darwin-x64-0.8.7.tgz", + "integrity": "sha512-sMMzFOwCo4WXR+/6zIBThOocSC50iIIZZdfiIDbaLvj0Ax/rWt/iavyfEAqajyvzydLyCqR/ZItdLWSRlu1umw==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-codegen/binding-freebsd-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-freebsd-x64/-/binding-freebsd-x64-0.8.7.tgz", + "integrity": "sha512-MpdpKXix9P+Y1rKgjvcNeNtGjXeL1CmttNhYINrWls8kRpm4xM/oBGTmn6w7to8lAlwj5jm8q03dQPl5mRv4Qw==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.8.7.tgz", + "integrity": "sha512-rr1srFLlPAmC1vtxfc9C1YLDe3iH09YjfSeeIidBqKhzx1MATjOAq4mjlRUOnhr/L27MotWIYOFKwVsd5JZFOg==", + "cpu": [ + "arm" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm-musl/-/binding-linux-arm-musl-0.8.7.tgz", + "integrity": "sha512-eAufXh8qBRpiSO6ueaMDL+yyoXIGLhpUce72YbcACtZU2qhExwBIJyEtQf5kH2Ki0X2aqkSjSfog4OPtKXan3Q==", + "cpu": [ + "arm" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.8.7.tgz", + "integrity": "sha512-gw4w6wPoHObBrdIC4duVWLmJOvpdE25j5D7yrM5mACNlK4klRz/lv8hK+ssQk9EJHBgZjSaqZIJVFgqNYbfv7A==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-arm64-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.8.7.tgz", + "integrity": "sha512-L68N6Y4XkqcIaKo3Ra88JEvBEH4AHff44A4INcrxeVWZ8CZtu2tCpfVxe3hR8qQQMcvBSQlDn24KpkCKEhVvfA==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.8.7.tgz", + "integrity": "sha512-dzyAbltJmf3Cqlb8HcFuYIf5Yn0fl1vTr3XJ9HiVNNvOlhqPSArOqtw9vI1p6/VTXTjrMLXlU+s+/kNHiIy/Cw==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-linux-x64-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-linux-x64-musl/-/binding-linux-x64-musl-0.8.7.tgz", + "integrity": "sha512-Otw4MH3404q0Bbvl+YTdW9aoUV5vXmUw8260bWvt1XlaoIX/ceSgI4ygheRDMfBPoHt6FDayQaO9OLVUZAgkFA==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-codegen/binding-win32-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-arm64/-/binding-win32-arm64-0.8.7.tgz", + "integrity": "sha512-qo/jyrzryiBuKEsFiuWaBCBe3tRMynQ0qFWFgOEjcCMQeZfBm+wKiVEUEFXXLc7bh8YezguAWp0Mtnhq4ARNyA==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-codegen/binding-win32-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-codegen/binding-win32-x64/-/binding-win32-x64-0.8.7.tgz", + "integrity": "sha512-D5lDsVDx6m00E6bWySlWdH72Ca4TPSaphDqB6QjU6MpuNLIJqoGoatYyq2rOmBE8Zv/kunot/o58KGL03P3eiA==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-codegen is pure JavaScript since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-android-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-android-arm64/-/binding-android-arm64-0.8.7.tgz", + "integrity": "sha512-eGKYiUDX7Y0V7tDTmg+JTVnXnjMqfXXsorZ+EDf5kxwchQ3Or1HS14MzI2fw+jFhHR85fCWt+mtX33Yao73hIQ==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-parser/binding-darwin-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.8.7.tgz", + "integrity": "sha512-Re0RHelKLnjEURulY2/KxW+Ngb8zuNA4BRZuMwgGQNzVumT6u4U2N2hc01oeYVNVof0i7GrXE4UCNBgbpRRnjQ==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-darwin-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-darwin-x64/-/binding-darwin-x64-0.8.7.tgz", + "integrity": "sha512-Hn8DROtQkjlA1ACbPgj4a7eP9IuVOI504oiTwpkWPbpaDWD9KdmnVYCqW+1LfenNK/g7O9NhWGpXEdaCNX7lIA==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-parser/binding-freebsd-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.8.7.tgz", + "integrity": "sha512-bAP2OV8wRuzplX/jYxv9+vvqQT8JxyNphI8fLfXGL054Xs+4/J5u33cIm3y4rxY8rdoLmmdiJs2Tq7r7lrDRfA==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.8.7.tgz", + "integrity": "sha512-kTYwJQQgmZeAWdDIWabiReIZMpmfLueIj1tCmjStUtFGhR1Z0qwxonKVfUC4N7h/VhGGzLZ//7O1kgt1QKqgCg==", + "cpu": [ + "arm" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm-musl/-/binding-linux-arm-musl-0.8.7.tgz", + "integrity": "sha512-uL4jE8HPT2BLlxAXyD10LqgPuXa9eDa0BKpCdSANmzIJghq/2eZo3/gQNtaxPZMupWoxjYzSad9IXrwu7aYPXQ==", + "cpu": [ + "arm" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.8.7.tgz", + "integrity": "sha512-3gVN4pWSKZmXiNX7cU164dR9MPvesCHnlH6nPfpK+yQsCuYphjKKplcb4SnZBrhiqmXbgb2HR0c2TS0IZUPhgA==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-arm64-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.8.7.tgz", + "integrity": "sha512-S0mwfEjoLpxzXeZw802Wa4RaELsQiPtWqG6INcy8j4GtvNFtl4LCX3eGO1XLn9pyLAISLzTRyU3zUCBUPin8lg==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-gnu": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.8.7.tgz", + "integrity": "sha512-lnbWdPmerE5D1uH1G4IEZKnPzCrWCStRGrtgpSIe1RibAo5bZIjDbbbPYXmMHCEh4F+x/JaJpElh26a3r+BPbg==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-linux-x64-musl": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.8.7.tgz", + "integrity": "sha512-769uwndMvMzUvATWbAcEvyLHKA+DzhHSCl/obBUrRdYfRo26yxui6S8y3z7uJ+Naup7UKrDxrpK7OnQkxkl9KQ==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-parser/binding-win32-arm64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-arm64/-/binding-win32-arm64-0.8.7.tgz", + "integrity": "sha512-mEB/9PlaAkisJ6KWGz0zvywXoU6+80dTlR2LwS7s/jcXXoU6fm2+sitBZXtqu3+Q4DcDgPxM45uWMCzPs0TSRw==", + "cpu": [ + "arm64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-parser/binding-win32-x64": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-parser/binding-win32-x64/-/binding-win32-x64-0.8.7.tgz", + "integrity": "sha512-8vNB2DP0ou61nGb8tc/qfi41gfyDXz1MHr2zqL3nR+cJ6CEbiuWV/l/a/vv151gCgiZLLAyGkQGENpozdg716w==", + "cpu": [ + "x64" + ], + "deprecated": "yuku-parser runs on yuku-core since 0.14", + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.8.7.tgz", + "integrity": "sha512-2Z53dNxAJL6UvFoIrDZvYf3zlO8s4VJK4O2hhaB4mXVwwpX/7ajtss3cmfqKvamlNLWyt9FSWs4eoYdlbxpnHA==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "devOptional": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alchemy": { + "version": "2.0.0-beta.78", + "resolved": "https://registry.npmjs.org/alchemy/-/alchemy-2.0.0-beta.78.tgz", + "integrity": "sha512-Dv3IstS7W5AFPgU4T2PKe/SRrtqfKnMHYEKaWWCjVneE8VTl6Zz7M/oG/jz1YSmzdPaq3YinQlRQK3ZFzhTmkw==", + "license": "Apache-2.0", + "dependencies": { + "@alchemy.run/cloudflare-runtime": "2.0.0-beta.78", + "@alchemy.run/floci": "2.0.0-beta.78", + "@alchemy.run/node-utils": "2.0.0-beta.78", + "@alchemy.run/sigil": "0.0.0-alpha.11", + "@aws-sdk/credential-providers": "^3.0.0", + "@distilled.cloud/aws": "1.0.0-rc.12", + "@distilled.cloud/axiom": "1.0.0-rc.12", + "@distilled.cloud/cloudflare": "1.0.0-rc.12", + "@distilled.cloud/core": "1.0.0-rc.12", + "@distilled.cloud/fly-io": "1.0.0-rc.12", + "@distilled.cloud/hetzner": "1.0.0-rc.12", + "@distilled.cloud/neon": "1.0.0-rc.12", + "@distilled.cloud/planetscale": "1.0.0-rc.12", + "@distilled.cloud/prisma": "1.0.0-rc.12", + "@distilled.cloud/railway": "1.0.0-rc.12", + "@distilled.cloud/stripe": "1.0.0-rc.12", + "@effect/sql-d1": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/sql-sqlite-do": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/vitest": ">=4.0.0-rc.115 || >=4.0.0", + "@libsql/client": "^0.17.0", + "@octokit/rest": "^22.0.1", + "@octokit/webhooks": "^14.2.0", + "@prisma/dev": "^0.20.0", + "@types/aws-lambda": "^8.10.152", + "aws4fetch": "^1.0.20", + "capnweb": "^0.12.0", + "fflate": "^0.8.3", + "libsodium-wrappers": "^0.8.3", + "pathe": "^2.0.3", + "picomatch": "^4.0.4", + "rolldown": "1.2.5", + "tinyglobby": "^0.2.17", + "undici": "^7.16.0", + "yaml": "^2.9.0" + }, + "bin": { + "alchemy": "bin/cli.js" + }, + "peerDependencies": { + "@alchemy.run/frontend-frameworks": "2.0.0-beta.78", + "@aws/durable-execution-sdk-js": "^2.1.0", + "@effect/platform-bun": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/platform-node": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/sql-mysql2": ">=4.0.0-rc.115 || >=4.0.0", + "@effect/sql-pg": ">=4.0.0-rc.115 || >=4.0.0", + "@vercel/nft": "^1.10.2", + "drizzle-kit": "1.0.0-rc.5-ab785fc", + "drizzle-orm": "1.0.0-rc.5-ab785fc", + "effect": ">=4.0.0-rc.115 || >=4.0.0", + "mongodb": "^6.10.0", + "mysql2": "^3.24.2", + "pg": "^8.22.0", + "vite": "^8.0.7", + "ws": "^8.21.0" + }, + "peerDependenciesMeta": { + "@alchemy.run/frontend-frameworks": { + "optional": true + }, + "@aws/durable-execution-sdk-js": { + "optional": true + }, + "@effect/platform-bun": { + "optional": true + }, + "@effect/platform-node": { + "optional": true + }, + "@effect/sql-mysql2": { + "optional": true + }, + "@effect/sql-pg": { + "optional": true + }, + "@vercel/nft": { + "optional": true + }, + "drizzle-kit": { + "optional": true + }, + "drizzle-orm": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "vite": { + "optional": true + }, + "ws": { + "optional": true + } + } + }, + "node_modules/alchemy/node_modules/@electric-sql/pglite": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.15.tgz", + "integrity": "sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==", + "license": "Apache-2.0" + }, + "node_modules/alchemy/node_modules/@electric-sql/pglite-socket": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-socket/-/pglite-socket-0.0.20.tgz", + "integrity": "sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==", + "license": "Apache-2.0", + "bin": { + "pglite-server": "dist/scripts/server.js" + }, + "peerDependencies": { + "@electric-sql/pglite": "0.3.15" + } + }, + "node_modules/alchemy/node_modules/@electric-sql/pglite-tools": { + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@electric-sql/pglite-tools/-/pglite-tools-0.2.20.tgz", + "integrity": "sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==", + "license": "Apache-2.0", + "peerDependencies": { + "@electric-sql/pglite": "0.3.15" + } + }, + "node_modules/alchemy/node_modules/@prisma/dev": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@prisma/dev/-/dev-0.20.0.tgz", + "integrity": "sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==", + "license": "ISC", + "dependencies": { + "@electric-sql/pglite": "0.3.15", + "@electric-sql/pglite-socket": "0.0.20", + "@electric-sql/pglite-tools": "0.2.20", + "@hono/node-server": "1.19.9", + "@mrleebo/prisma-ast": "0.13.1", + "@prisma/get-platform": "7.2.0", + "@prisma/query-plan-executor": "7.2.0", + "foreground-child": "3.3.1", + "get-port-please": "3.2.0", + "hono": "4.11.4", + "http-status-codes": "2.3.0", + "pathe": "2.0.3", + "proper-lockfile": "4.1.2", + "remeda": "2.33.4", + "std-env": "3.10.0", + "valibot": "1.2.0", + "zeptomatch": "2.1.0" + } + }, + "node_modules/alchemy/node_modules/undici": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/alchemy/node_modules/valibot": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.2.0.tgz", + "integrity": "sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-4.4.0.tgz", + "integrity": "sha512-9k3v7xcHwgdO/DruxGIg4HtjvlAZlcnsX/mzqUb1t3NkYnl9kK2UJ+Gq0io+vQf7iT//BD/HB/NBkUR1LWxoeA==", + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arkregex": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/arkregex/-/arkregex-0.0.14.tgz", + "integrity": "sha512-G3I/uCtWE0IKQiPh0qqmmAFDdtjZKZQ5mNPR6gJBeAMZ7VqYCpoaDeXnLju2Zo6ywExtmxZJELeVFb0MPDjPyA==", + "license": "MIT", + "dependencies": { + "@ark/util": "0.56.8" + } + }, + "node_modules/arktype": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/arktype/-/arktype-2.2.9.tgz", + "integrity": "sha512-Cja0IMEn19rB35on9da1i1z6QMasuS7ULffXbetCry09jvCGYT8Bi1KgYiqri5FymF4nQAXkM90yksYkgSK2EA==", + "license": "MIT", + "dependencies": { + "@ark/schema": "0.56.8", + "@ark/util": "0.56.8", + "arkregex": "0.0.14" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.2.0.tgz", + "integrity": "sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "es-shim-unscopables": "^1.1.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws4fetch": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/aws4fetch/-/aws4fetch-1.0.20.tgz", + "integrity": "sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==", + "license": "MIT" + }, + "node_modules/axe-core": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.14.0.tgz", + "integrity": "sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.9.0.tgz", + "integrity": "sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/bare-events": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.9.2.tgz", + "integrity": "sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.8.4.tgz", + "integrity": "sha512-MPC2eyrpbk3A873sK4y6rk+Iv4o2enxTjHZ8zH3HO0mjrpm5XjnguY2XmfidIsDV6vnjpbMBKUAJpV0ISD2SsQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.28.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-path": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.1.2.tgz", + "integrity": "sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bare-stream": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.4.tgz", + "integrity": "sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.8.1", + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.5.5.tgz", + "integrity": "sha512-iM9qJCruvpt2rPaLsrumVDru9pogI7PHziHIa9kTNRFt8C8HuSa+kI9kFezK+NvHEFnnz71rKGZ1EAilq/3V/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.33.tgz", + "integrity": "sha512-yiVKDX+qCMRKBE084lXvq9EcwFUhKZ2nU8TK1EQQuOgPNR/lmbGxXOeDdlGUqC2Zz11Cs9rk1d/8NfgBmlkt0w==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/before-after-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", + "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==", + "license": "Apache-2.0" + }, + "node_modules/better-result": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/better-result/-/better-result-2.10.0.tgz", + "integrity": "sha512-oQhh0y1qo2/ZKdAAEvHZAqKKiHOFU5k/bW96fE2ScgQOVkJRiHwB+nOS1SgFsYqRlxMDWvefXi9Q3px7QvgNDw==", + "license": "MIT" + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bowser": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.15.0.tgz", + "integrity": "sha512-xic6KSZglg/I4ymp45fdM4GWfYpBK79Fxd/TOvJktlaPgQqqDxvmGwOPZl2V0dyeS3Lj5c180bLhXF43iyAjZQ==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.29.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.5.tgz", + "integrity": "sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.33", + "caniuse-lite": "^1.0.30001819", + "electron-to-chromium": "^1.5.464", + "node-releases": "^2.0.60", + "update-browserslist-db": "^1.3.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.1.tgz", + "integrity": "sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/c12": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.4.tgz", + "integrity": "sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==", + "license": "MIT", + "dependencies": { + "chokidar": "^5.0.0", + "confbox": "^0.2.4", + "defu": "^6.1.6", + "dotenv": "^17.3.1", + "exsolve": "^1.0.8", + "giget": "^3.2.0", + "jiti": "^2.6.1", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^2.1.0", + "pkg-types": "^2.3.0", + "rc9": "^3.0.1" + }, + "peerDependencies": { + "magicast": "*" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/cac": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz", + "integrity": "sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==", + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capnp-es": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/capnp-es/-/capnp-es-0.0.16.tgz", + "integrity": "sha512-pqhhnRqGfDdgHa+rz4JVO9j1jnkyqsHRYrD4RBtIwxCknYSRG7Mjs+x3IRfd20u+ZGS0IhW2L7cDv9ZcIkCYhQ==", + "license": "MIT", + "bin": { + "capnp-es": "dist/compiler/capnpc-js.mjs", + "capnpc-dts": "dist/compiler/capnpc-dts.mjs", + "capnpc-js": "dist/compiler/capnpc-js.mjs", + "capnpc-ts": "dist/compiler/capnpc-ts.mjs" + }, + "peerDependencies": { + "typescript": "^5.7.3 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/capnweb": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/capnweb/-/capnweb-0.12.0.tgz", + "integrity": "sha512-jgZ/LMtMVTi+RVlooIslH78Gg23XbDTdvcLghWx3oz17D6u5GuJARt+uhZk/wcTo+f81eeabfnow4d3zLBj+JQ==", + "license": "MIT", + "workspaces": [ + ".", + "packages/*" + ] + }, + "node_modules/chai": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chevrotain": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-10.5.0.tgz", + "integrity": "sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "10.5.0", + "@chevrotain/gast": "10.5.0", + "@chevrotain/types": "10.5.0", + "@chevrotain/utils": "10.5.0", + "lodash": "4.17.21", + "regexp-to-ast": "0.5.0" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/clipanion": { + "version": "4.0.0-rc.4", + "resolved": "https://registry.npmjs.org/clipanion/-/clipanion-4.0.0-rc.4.tgz", + "integrity": "sha512-CXkMQxU6s9GklO/1f714dkKBMu1lopS1WFF0B8o4AxPykR1hpozxSiUZ5ZUeBjfPgCWqbcNOtZVFhB8Lkfp1+Q==", + "license": "MIT", + "workspaces": [ + "website" + ], + "dependencies": { + "typanion": "^3.8.0" + }, + "peerDependencies": { + "typanion": "*" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/closest-match": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/closest-match/-/closest-match-1.3.3.tgz", + "integrity": "sha512-RSdHrZwNOvt2uMQgqJDJdM/I+5MlJ1tQJEXYrbRjSMXWiCRo06g2hwObJ7+WKt2J9ySK9/pJ0Q2vbL+BPkofDA==", + "license": "ISC" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/content-type": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-3.1.1.tgz", + "integrity": "sha512-GW4qUsfFo59d0HbUibDlWv5wPz+vAAcaTWbKIuKCf0JkC7wWkSyf8f13IpXn5JkeMlB2P8iTSSIjwXljorg2vA==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/effect": { + "version": "4.0.0-rc.115", + "resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-rc.115.tgz", + "integrity": "sha512-ogYulZ5ffeOzrJqQrG0XOkDO5lKn2s9KNHhoxJy/6wKUkF0i12dlVXWA9TgsgQ+zV/JzizyG0+XMPepZEQX6vw==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.464.tgz", + "integrity": "sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/empathic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz", + "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.13.0.tgz", + "integrity": "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "11.1.5 || >11.1.6 <12", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.4.2.tgz", + "integrity": "sha512-P33vjcETMXc+qBjpF77TeJHZLzk6cPcTy8KjpxLucYB3mCIFIORMcZ+cBXcAiIYjE5RM7jyknEEOwMNdnx/ADQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.4.2", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.1.0", + "globals": "16.4.0", + "typescript-eslint": "^8.56.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-config-next/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-config-next/node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-config-next/node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, + "node_modules/execa": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", + "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.6", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.1", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.2.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.3.tgz", + "integrity": "sha512-kuzL9zherLQoqDeQaS55AiiIg1kb4KYXaSusTtgZTPlvKP2gGCI82LNmBNh5RjDVUXIcmgx+/Mx7vPwRzBbhJA==", + "license": "MIT" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-string-truncated-width": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz", + "integrity": "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==", + "license": "MIT" + }, + "node_modules/fast-string-width": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-string-width/-/fast-string-width-3.0.2.tgz", + "integrity": "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==", + "license": "MIT", + "dependencies": { + "fast-string-truncated-width": "^3.0.2" + } + }, + "node_modules/fast-uri": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-wrap-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fast-wrap-ansi/-/fast-wrap-ansi-0.2.2.tgz", + "integrity": "sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==", + "license": "MIT", + "dependencies": { + "fast-string-width": "^3.0.2" + } + }, + "node_modules/fast-xml-builder": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.3.1.tgz", + "integrity": "sha512-pIM/1n3ntFXKYrUZwW7QCK0gAW7XY+wzj1YMIV3tLDvPj/V+zTGJK5e3/4WJfwj0qWw2ElNXiTixda/R+3YSug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.6.2", + "xml-naming": "^0.3.0" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.11.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.2.tgz", + "integrity": "sha512-R9iDuNrQYeQut46cn2r2wHKn4HYzVDvDm5J1wW+koZewykv0yuO2HChTYeZtrULyHIDM9cj9TUXloCsueCQUog==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "@nodable/entities": "^3.0.1", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.2", + "xml-naming": "^0.3.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fflate": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", + "license": "MIT" + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.23" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-my-way": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.7.0.tgz", + "integrity": "sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-port-please": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.2.0.tgz", + "integrity": "sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==", + "license": "MIT" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.5.tgz", + "integrity": "sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==", + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/giget": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.1.tgz", + "integrity": "sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==", + "license": "MIT", + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/grammex": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/grammex/-/grammex-3.1.13.tgz", + "integrity": "sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==", + "license": "MIT" + }, + "node_modules/graphmatch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/graphmatch/-/graphmatch-1.1.1.tgz", + "integrity": "sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==", + "license": "MIT" + }, + "node_modules/graphql": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", + "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hono": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", + "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hookable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz", + "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==", + "license": "MIT" + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", + "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-without-cache": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz", + "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-in-ssh": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", + "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unsafe": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-2.0.2.tgz", + "integrity": "sha512-HgbIHPBH0KHHCcjLfGsCvhtPTVxjaAZlXjwdz7/GQC40SjSe4sfQsar8J5VFo8JOSbarkpV0OLG95bbaNd9aAQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "node_modules/jose": { + "version": "6.2.13", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.13.tgz", + "integrity": "sha512-7TIg10ZE1x82YediN+lcrPNvGMKge9yFHQD+Qho/b8y2adfugU3AsvvHfxV0fzyFllT6l9xCjf4RWY9g/Z9PJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-base64": { + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.9.5.tgz", + "integrity": "sha512-u0CFDUca8BbBRkMkF/fDcuoLCx9nTNbXdVtbjVnBqySA9E221u0uYKbACiYGOEk1heY69qM4caeX3OwjSyxevw==", + "license": "BSD-3-Clause" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-with-bigint": { + "version": "3.5.12", + "resolved": "https://registry.npmjs.org/json-with-bigint/-/json-with-bigint-3.5.12.tgz", + "integrity": "sha512-uwbF/wSSuOgC7qqlq27Xp5B6a2MHVug3t0idZdTqu0JnlFvgJuH7ju+KAk/J06C7GfhoYy2gnb9wz2INqcne7w==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libsodium": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.8.4.tgz", + "integrity": "sha512-lMcYaRi0zcs7tarATsQUYC7rstliIXZuoq0c6zXSgNtSNtdvBgkSegjWhpMJAXzKX3SUSwIp7+zEsob+j3LuRw==", + "license": "ISC" + }, + "node_modules/libsodium-wrappers": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.8.4.tgz", + "integrity": "sha512-mu8aAWucZjTB5O/BtGXtW4e1agy7uHxNYG7zPthmmD1jU43LCDmSWZLN4JhflbdPXj3yDO4lxM1O9hLDgIOXDw==", + "license": "ISC", + "dependencies": { + "libsodium": "^0.8.0" + } + }, + "node_modules/libsql": { + "version": "0.5.29", + "resolved": "https://registry.npmjs.org/libsql/-/libsql-0.5.29.tgz", + "integrity": "sha512-8lMP8iMgiBzzoNbAPQ59qdVcj6UaE/Vnm+fiwX4doX4Narook0a4GPKWBEv+CR8a1OwbfkgL18uBfBjWdF0Fzg==", + "cpu": [ + "x64", + "arm64", + "wasm32", + "arm" + ], + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "dependencies": { + "@neon-rs/load": "^0.0.4", + "detect-libc": "2.0.2" + }, + "optionalDependencies": { + "@libsql/darwin-arm64": "0.5.29", + "@libsql/darwin-x64": "0.5.29", + "@libsql/linux-arm-gnueabihf": "0.5.29", + "@libsql/linux-arm-musleabihf": "0.5.29", + "@libsql/linux-arm64-gnu": "0.5.29", + "@libsql/linux-arm64-musl": "0.5.29", + "@libsql/linux-x64-gnu": "0.5.29", + "@libsql/linux-x64-musl": "0.5.29", + "@libsql/win32-x64-msvc": "0.5.29" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.544.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.544.0.tgz", + "integrity": "sha512-t5tS44bqd825zAW45UQxpG2CvcC4urOwn2TrwSH8u+MjeE+1NnWl6QqeQ/6NdjMqdOygyiT9p3Ev0p1NJykxjw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", + "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/modern-tar": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.8.6.tgz", + "integrity": "sha512-LYSks0tNVqbtez/9OB0YFP6qLRSqkdAxJWOQpVaR67lNTbj2zNLyYpowkRMia5lXLCZKzxwoxkxH2MbbBR2aEg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.7.tgz", + "integrity": "sha512-jyU4cU4kVAmy/3qjP+DcoQTNXfINHc+dFw54gGqWC8nu0mpV0kOnk7kff+J+Q18SbX0k3Np8Rm7yFjd3phatNQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-patch": "lib/patch.js", + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/next/-/next-16.4.2.tgz", + "integrity": "sha512-r+oBJojfefUjOiWkBhXgLS+igxX/7BWyK59uHnyOyplMSLtBZ+QLP3okrdYTbrfrbrmNTVWLBPaHDX9KRaIt3w==", + "license": "MIT", + "dependencies": { + "@next/env": "16.4.2", + "@swc/helpers": "0.5.23", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.5.23", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.4.2", + "@next/swc-darwin-x64": "16.4.2", + "@next/swc-linux-arm64-gnu": "16.4.2", + "@next/swc-linux-arm64-musl": "16.4.2", + "@next/swc-linux-x64-gnu": "16.4.2", + "@next/swc-linux-x64-musl": "16.4.2", + "@next/swc-win32-arm64-msvc": "16.4.2", + "@next/swc-win32-x64-msvc": "16.4.2", + "sharp": "^0.35.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "devOptional": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "node_modules/open": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/open/-/open-11.0.4.tgz", + "integrity": "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.5.1", + "define-lazy-prop": "^3.0.0", + "is-in-ssh": "^1.0.0", + "is-inside-container": "^1.0.0", + "powershell-utils": "^0.2.1", + "wsl-utils": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/openapi-fetch": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.14.0.tgz", + "integrity": "sha512-PshIdm1NgdLvb05zp8LqRQMNSKzIlPkyMxYFxwyHR+UlKD4t2nUjkDhNxeRbhRSEd3x5EUNh2w5sJYwkhOH4fg==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.0.15" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.0.15.tgz", + "integrity": "sha512-opyTPaunsklCBpTK8JGef6mfPhLSnyy5a0IN9vKtx3+4aExf+KxEqYwIy3hqkedXIB97u357uLMJsOnm3GVjsw==", + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==", + "license": "MIT" + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz", + "integrity": "sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.22.0.tgz", + "integrity": "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA==", + "license": "MIT", + "dependencies": { + "pg-connection-string": "^2.14.0", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.15.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz", + "integrity": "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "license": "MIT" + }, + "node_modules/pg-cursor": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.22.1.tgz", + "integrity": "sha512-X10ldv3wwBONQkOSwgWEbaEITMGLd92V2Zd+xsFPhDt3nhhU3hpAT08SERBChnIFmomczLax6lKXLJrHPPXfxA==", + "license": "MIT", + "peerDependencies": { + "pg": "^8" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.4.0.tgz", + "integrity": "sha512-07Fys7iVx0X6TcviMOgogM1Lk33ZyqOezMnU79S+kffWqwolG/5W9V8EgQSeYCIfFTYVgssRbnH630Oa2+soBA==", + "license": "MIT", + "dependencies": { + "confbox": "^0.3.1", + "exsolve": "^1.1.3", + "pathe": "^2.0.3" + } + }, + "node_modules/pkg-types/node_modules/confbox": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz", + "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", + "license": "MIT" + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/powershell-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.2.1.tgz", + "integrity": "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.10.tgz", + "integrity": "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.1.tgz", + "integrity": "sha512-HzMy3Geq23nVALD/M2LliU+F+M+gVNsvkQWWqeBZ8HDiCgzo6YPJ/Omrmtq24EFrIsk0a3EkQGEd7bDOo+IhGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prisma": { + "version": "8.0.0-rc.22", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-8.0.0-rc.22.tgz", + "integrity": "sha512-PaOZPZq2b/UDUgFkC2IlsAKG+ulv2+ojJg2lHquYPZY1OElQeD8D0PEoekCWusaRor2AhjS/uiOc+AGZuAskAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@manypkg/tools": "^2.1.2", + "@prisma/cli-engine": "0.7.0", + "@prisma/composer-cli": "0.29.1", + "@prisma/compute-sdk": "0.43.0", + "@prisma/management-api-sdk": "1.80.0", + "@prisma/orm-toolchain": "8.0.0-rc.17", + "@vercel/detect-agent": "^1.2.3", + "better-result": "^2.9.2", + "cross-spawn": "^7.0.6", + "dotenv": "^17.4.2", + "execa": "^9.6.1", + "open": "^11.0.0" + }, + "bin": { + "prisma": "dist/prisma.js" + }, + "engines": { + "node": ">=22.18.0" + } + }, + "node_modules/prisma/node_modules/@prisma/management-api-sdk": { + "version": "1.80.0", + "resolved": "https://registry.npmjs.org/@prisma/management-api-sdk/-/management-api-sdk-1.80.0.tgz", + "integrity": "sha512-pQN6hBqR2pgaF3S5sMCe3iZIlThIOgUXoDcinB6/AxXO3qM6oWnirSUAJlhFQ/Hr5A2PmdxScOuCB1dJYHZ4KQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "openapi-fetch": "0.14.0" + } + }, + "node_modules/promise-limit": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/promise-limit/-/promise-limit-2.7.0.tgz", + "integrity": "sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==", + "license": "ISC" + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/rc9": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-3.1.0.tgz", + "integrity": "sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==", + "license": "MIT", + "dependencies": { + "defu": "^6.1.7", + "destr": "^2.0.5" + } + }, + "node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.1" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-reconciler": { + "version": "0.34.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.34.0.tgz", + "integrity": "sha512-eVibvB1fc9j5Qf1KRkiM3GzRPBdjg2P6G6QV2f3P6Eb3OGMxRBhdg2rrUwjbV5JrQaJj8nOa8uajmmJA5tJWjQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.28.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.3.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", + "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", + "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", + "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/redis": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-6.3.0.tgz", + "integrity": "sha512-XFQbPie1lGpKeUZ8ySYY43yLnQy/iIQtHNvIr/1XdaABpb96rUSdm3Mfl+98FEVbv9ZJIzINMno5s0Nh8E5LEw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@redis/bloom": "6.3.0", + "@redis/client": "6.3.0", + "@redis/json": "6.3.0", + "@redis/search": "6.3.0", + "@redis/time-series": "6.3.0" + }, + "engines": { + "node": ">= 20.0.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/remeda": { + "version": "2.33.4", + "resolved": "https://registry.npmjs.org/remeda/-/remeda-2.33.4.tgz", + "integrity": "sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remeda" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resource-scheduler": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/resource-scheduler/-/resource-scheduler-1.6.0.tgz", + "integrity": "sha512-4/rmZ7O4lSV91SjGiAjSCulSi+Z4HsB8MPbs8EOpdno/vxqyJu8vCNXxZqfdb8uoDwquBZaHBSv4WKGI3t3jwA==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-popover": "^1.1.15", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-tabs": "^1.1.13", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "date-fns": "^4.1.0", + "lucide-react": "^0.544.0", + "tailwind-merge": "^3.3.1" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + } + }, + "node_modules/ret": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.1.tgz", + "integrity": "sha512-Z/nyvABwcRnRD2mMP7Kz6G1dFZZqX1mNErOnxF42OCQKE07b9k9hK9SQxHL3LFEZUdzQaLM4dId1E/E6Vm4WhA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.146.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" + } + }, + "node_modules/rolldown-plugin-dts": { + "version": "0.27.14", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.27.14.tgz", + "integrity": "sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==", + "license": "MIT", + "dependencies": { + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.5", + "obug": "^2.1.4", + "yuku-ast": "^0.8.0", + "yuku-codegen": "^0.8.0", + "yuku-parser": "^0.8.0" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": "*", + "@volar/typescript": "~2.4.0", + "rolldown": "^1.0.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "@volar/typescript": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex2": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.2.tgz", + "integrity": "sha512-tAtCGFPPP02VroDVzp4daGi6bC7jWG+41D47GKf18FeH/ubvKQHT9VmhAkvtjNOmJwqtApzWeUpEhkyEYULvmw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.1.0", + "detect-libc": "^2.1.2", + "semver": "^7.8.5" + }, + "engines": { + "node": ">=20.9.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/sharp/node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamx": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.28.1.tgz", + "integrity": "sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.3.0.tgz", + "integrity": "sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==", + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.1.0.tgz", + "integrity": "sha512-tHNHTxInrYLCga9O9YGxWA3G9/nnzQw8UGAyqGx3Ar1pSTTzIuM4woFSq4SowkXCjJIwq5sIiQvEfRI9tCH1qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "get-intrinsic": "^1.3.0", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.4", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.5.1.tgz", + "integrity": "sha512-UM4nTLWzQiDBseVxUGxN0wJzIk0UU89Qi7pKXz9qISo+lhviJikTuikBsK/oFRlpvYHvSdz0TVoLyQ+sEpYwxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "anynum": "^1.0.1" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz", + "integrity": "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.2.tgz", + "integrity": "sha512-+8NeqHRjQWH9nYlwo2gamAMImZCVzI4UoEgDpWorBt9OEfppiZn+uSkskzQKPWIZyji/C8fpWO7u69G0DX0tbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.9.0", + "bare-fs": "^4.8.2", + "fast-fifo": "^1.3.2", + "streamx": "^2.28.1" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "devOptional": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/temporal-polyfill": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/temporal-polyfill/-/temporal-polyfill-1.0.6.tgz", + "integrity": "sha512-tYyEry1HLGUDbm2356W3iYD0OZdo7rlP7h98Zr/EnjqLZQwTAfcBDUvJnJbfA15v/vQad57hJZScG5O0W2oKEA==", + "license": "MIT", + "dependencies": { + "temporal-spec": "1.0.1", + "temporal-utils": "1.0.3" + } + }, + "node_modules/temporal-spec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/temporal-spec/-/temporal-spec-1.0.1.tgz", + "integrity": "sha512-wxVoanmDeavXie1vu2JaQ3WIc3JZnWAOYFBsJyATaVsXsycKYUflGsyBmrRSnoCpZJpwPyr38VpgSUlQ8CbFxg==", + "license": "Apache-2.0" + }, + "node_modules/temporal-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/temporal-utils/-/temporal-utils-1.0.3.tgz", + "integrity": "sha512-9jbTSX3HvkOWvDpNpFzwX/d1mkCrgQgwLmVTOEiuocZGKHsrQJtttGZFmybJ2zYP5zCSZuU5ZyeS8+eOEPABiQ==", + "license": "MIT" + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.2.tgz", + "integrity": "sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-toolbelt": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz", + "integrity": "sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsdown": { + "version": "0.22.14", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.22.14.tgz", + "integrity": "sha512-ule7Y+fsAN2iZbLDoo7C4KYljFJNJJ+fLshyn+9gozeTspVersWHxwdGB+Dm2hzA38s6muFnUTl0jK3vJm9ifQ==", + "license": "MIT", + "dependencies": { + "ansis": "^4.3.1", + "cac": "^7.0.0", + "defu": "^6.1.7", + "empathic": "^2.0.1", + "hookable": "^6.1.1", + "import-without-cache": "^0.4.0", + "obug": "^2.1.4", + "picomatch": "^4.0.5", + "rolldown": "~1.2.0", + "rolldown-plugin-dts": "^0.27.13", + "tinyexec": "^1.2.4", + "tinyglobby": "^0.2.17", + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0", + "verkit": "^0.3.0" + }, + "bin": { + "tsdown": "dist/run.mjs" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.22.14", + "@tsdown/exe": "0.22.14", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": "^0.5.0", + "unrun": "*" + }, + "peerDependenciesMeta": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { + "optional": true + }, + "@tsdown/exe": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { + "optional": true + }, + "typescript": { + "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typanion": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/typanion/-/typanion-3.14.0.tgz", + "integrity": "sha512-ZW/lVMRabETuYCd9O9ZvMhAh8GslSqaUjxmK/JLPCh6l73CvLBiuXswj/+7LdnWOgYsQ130FqLzFz5aGT4I3Ug==", + "license": "MIT", + "workspaces": [ + "website" + ] + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.5.tgz", + "integrity": "sha512-0FHJvLPqZ7KJzp17O13jfsAjsqazgrxBu2zEK95PmUz8lv2+GjRuxUInCr2Rk9Dms3ihN21zJ929ZO43yJ95QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.72.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.72.1.tgz", + "integrity": "sha512-3Li9FfPmQp45nxEtFD1ZCrYFI3cYK5kpyNtmm1H7lMagm8u9sy6PTjy3ytwQZs7KNukOyKFHAZ6z6GjYFeaeXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.72.1", + "@typescript-eslint/parser": "8.72.1", + "@typescript-eslint/typescript-estree": "8.72.1", + "@typescript-eslint/utils": "8.72.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/undici": { + "version": "8.12.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.12.3.tgz", + "integrity": "sha512-+fdndUTwBP86cVjihTp21hZHo7d6oj1c/47XPA3lL8mM0XHs+C4EkcjmgRsFnFk2f/UONGDy9ItBItmXsLOQHw==", + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uniku": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/uniku/-/uniku-0.5.0.tgz", + "integrity": "sha512-giSrg7xqM5YWkSlyheulHgTTInhYh/m0cFZOOuChi/TO87hKlxmZLllETlvDw/lPB54NIs1iW/x2rr0y2yFXHg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/universal-user-agent": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", + "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==", + "license": "ISC" + }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", + "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", + "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/valibot": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-1.4.2.tgz", + "integrity": "sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==", + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/verkit": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.3.2.tgz", + "integrity": "sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==", + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/vite": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@oxc-project/types": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rolldown": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@oxc-project/types": "=0.155.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" + } + }, + "node_modules/vitest": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.5.tgz", + "integrity": "sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==", + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.5", + "chai": "^6.3.0", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.4.3", + "obug": "^3.0.0", + "picomatch": "^4.0.7", + "std-env": "^4.3.0", + "tinybench": "^6.2.2", + "tinyexec": "^1.3.1", + "tinyglobby": "^0.2.17", + "why-is-node-running": "3.2.1" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.5", + "@vitest/browser-preview": "5.0.5", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.5", + "@vitest/coverage-v8": "5.0.5", + "@vitest/ui": "5.0.5", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/magic-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.4.tgz", + "integrity": "sha512-jQz9sVhrZuphH4NrAIHSgkDJCluQO7Ioi4KGRLa7aTUjAODQ13hENX0YIytqYE/rIkO485gQG2LeBxJaW53kkQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0" + } + }, + "node_modules/vitest/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/vitest/node_modules/std-env": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", + "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.1.tgz", + "integrity": "sha512-rfuA6T75H6m5EkbhtEPzre9pT0HPcDI2MMy4+nPFIBks5J8JBAUHD4tRYSgaBOijIEC7SRkC1kKyXTLqbmh9jw==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-10.1.0.tgz", + "integrity": "sha512-9gEWpXkYGXoqG7pBnE8O8hx/yP7+Aabn4+peQ3KDicQv6qunHSWyLTud3OF0w4S2+HfDD+5HqYKiXQW9HAU6mA==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.18.2" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.2.tgz", + "integrity": "sha512-XRyDbT0Pp3sSNti3JmxVEUMySWCSi1hhM+/KUlCy1hV1zmrqpM1OwO12EAki8blhmLuIMpaJrYbo0OzGVfK2Qg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "9.0.1", + "vscode-languageserver-types": "3.18.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.0.tgz", + "integrity": "sha512-8TsGPNMIMiiBdkORgRSvLjuiEIiAFtO+KssmYWxQ+uSVvlf7RjK8YKCOjPzZ+YA04jXEV7+7LvkSmHkhpNS99g==", + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "devOptional": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.24", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.24.tgz", + "integrity": "sha512-wk4Mf4pR5mRP7eYuuTBCIQ9d0ud2Fv2jRLQpfgnRjbOxAFHmjKFValgTpitVKzJJS8ajnYQV2Du1SZ8j6b/EUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.1.tgz", + "integrity": "sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==", + "license": "MIT", + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=20.11" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerd": { + "version": "1.20260901.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260901.1.tgz", + "integrity": "sha512-Z5PVprrPRlV70+RzgbFpzoPpjCLGtErhsQ9Ahe96pe7hJGMsmexTU4+rhUPH+2Sguf7vRAxFFsqXpkIleRFSPA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260901.1", + "@cloudflare/workerd-darwin-arm64": "1.20260901.1", + "@cloudflare/workerd-linux-64": "1.20260901.1", + "@cloudflare/workerd-linux-arm64": "1.20260901.1", + "@cloudflare/workerd-windows-64": "1.20260901.1" + } + }, + "node_modules/wrap-ansi": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-10.0.2.tgz", + "integrity": "sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.3", + "string-width": "^8.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsl-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-1.0.1.tgz", + "integrity": "sha512-c16PKLIRxBYpR3jSWsdS7SFp0COm5SOQdiFjY818dYFHJbMGuLBszpF07LBWmOS1uzrHa9VGdynsEgoeKy0oOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0", + "powershell-utils": "^0.2.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-naming": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.3.0.tgz", + "integrity": "sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.2.0.tgz", + "integrity": "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==", + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^8.2.1", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yauzl": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz", + "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yuku-ast": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.8.7.tgz", + "integrity": "sha512-h6+4bDfyootiMB9vckk5uKo5r5j0GHrkr17FQTDNfEsFT3DWlN9uu1HJwQwc64pgmLCI945fWM3lbTIqxjT3GQ==", + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.8.7" + } + }, + "node_modules/yuku-codegen": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.8.7.tgz", + "integrity": "sha512-adwDZSh8oVDzhE6Du9PwVWxcOxeV0e2EVhUuMKWfhSY4wkrDq9eqixlxFF3l/XGUV1E7UFzhpz9393MUumkyNw==", + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.8.7" + }, + "optionalDependencies": { + "@yuku-codegen/binding-android-arm64": "0.8.7", + "@yuku-codegen/binding-darwin-arm64": "0.8.7", + "@yuku-codegen/binding-darwin-x64": "0.8.7", + "@yuku-codegen/binding-freebsd-x64": "0.8.7", + "@yuku-codegen/binding-linux-arm-gnu": "0.8.7", + "@yuku-codegen/binding-linux-arm-musl": "0.8.7", + "@yuku-codegen/binding-linux-arm64-gnu": "0.8.7", + "@yuku-codegen/binding-linux-arm64-musl": "0.8.7", + "@yuku-codegen/binding-linux-x64-gnu": "0.8.7", + "@yuku-codegen/binding-linux-x64-musl": "0.8.7", + "@yuku-codegen/binding-win32-arm64": "0.8.7", + "@yuku-codegen/binding-win32-x64": "0.8.7" + } + }, + "node_modules/yuku-parser": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.8.7.tgz", + "integrity": "sha512-vRD9nwt4L3aYpxNqeSC4WqLv58xrXef0Ong1Mc45CTXTIpvLafx7JO05sczmQZwdLEZvywrLOGdNC5+Rp5N1BQ==", + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.8.7", + "yuku-ast": "^0.8.7" + }, + "optionalDependencies": { + "@yuku-parser/binding-android-arm64": "0.8.7", + "@yuku-parser/binding-darwin-arm64": "0.8.7", + "@yuku-parser/binding-darwin-x64": "0.8.7", + "@yuku-parser/binding-freebsd-x64": "0.8.7", + "@yuku-parser/binding-linux-arm-gnu": "0.8.7", + "@yuku-parser/binding-linux-arm-musl": "0.8.7", + "@yuku-parser/binding-linux-arm64-gnu": "0.8.7", + "@yuku-parser/binding-linux-arm64-musl": "0.8.7", + "@yuku-parser/binding-linux-x64-gnu": "0.8.7", + "@yuku-parser/binding-linux-x64-musl": "0.8.7", + "@yuku-parser/binding-win32-arm64": "0.8.7", + "@yuku-parser/binding-win32-x64": "0.8.7" + } + }, + "node_modules/zeptomatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/zeptomatch/-/zeptomatch-2.1.0.tgz", + "integrity": "sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==", + "license": "MIT", + "dependencies": { + "grammex": "^3.1.11", + "graphmatch": "^1.1.0" + } + }, + "node_modules/zod": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/compute/room-booking-prisma-template/package.json b/compute/room-booking-prisma-template/package.json new file mode 100644 index 000000000000..e142aaf9010e --- /dev/null +++ b/compute/room-booking-prisma-template/package.json @@ -0,0 +1,58 @@ +{ + "name": "room-booking-prisma-template", + "version": "0.1.0", + "private": true, + "description": "Room booking without double bookings: Next.js, Resource Scheduler, Prisma ORM, Prisma Postgres and Prisma Compute.", + "license": "MIT", + "packageManager": "npm@10.9.4", + "type": "module", + "engines": { + "node": ">=24.11.1" + }, + "scripts": { + "build": "next build", + "composer:deploy": "prisma deploy module.ts", + "composer:dev": "prisma dev module.ts", + "contract:emit": "prisma contract emit", + "db:migrate": "prisma db migrate --yes", + "db:seed": "node --env-file-if-exists=.env.local src/prisma/seed-cli.ts", + "db:verify": "prisma db verify", + "deploy": "npm run build && npm run composer:deploy", + "dev": "next dev", + "dev:composer": "npm run build && npm run composer:dev", + "lint": "eslint", + "migration:plan": "prisma migration plan", + "migration:show": "prisma migration show", + "migration:status": "prisma migration status", + "test": "vitest run", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@prisma/composer": "0.29.1", + "@prisma/composer-prisma-cloud": "0.29.1", + "@prisma/orm-postgres": "8.0.0-rc.17", + "alchemy": "2.0.0-beta.78", + "effect": "4.0.0-rc.115", + "next": "16.4.2", + "react": "19.3.1", + "react-dom": "19.3.1", + "resource-scheduler": "^1.6.0", + "temporal-polyfill": "^1.0.6", + "zod": "^4.6.7" + }, + "devDependencies": { + "@prisma/dev": "0.25.2", + "@types/node": "^26.6.5", + "@types/react": "^19.3.0", + "@types/react-dom": "^19.3.0", + "eslint": "^10.13.0", + "eslint-config-next": "16.4.2", + "prisma": "8.0.0-rc.22", + "tsx": "^4.23.15", + "typescript": "^6.0.3", + "vitest": "^5.0.5" + }, + "overrides": { + "@vitejs/devtools": "0.7.6" + } +} diff --git a/compute/room-booking-prisma-template/prisma.config.ts b/compute/room-booking-prisma-template/prisma.config.ts new file mode 100644 index 000000000000..8337342983ab --- /dev/null +++ b/compute/room-booking-prisma-template/prisma.config.ts @@ -0,0 +1,32 @@ +import { definePrismaConfig } from "prisma/config"; +import { defineConfig as ormConfig } from "@prisma/orm-postgres/config"; +import { defineConfig as composer } from "@prisma/composer/config"; +import { nodeBuild } from "@prisma/composer/node/control"; +import { nextjsBuild } from "@prisma/composer/nextjs/control"; +import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control"; + +// The prisma CLI does not read env files by itself. Load .env.local when there +// is one, so `cp .env.example .env.local` is all the local setup the db:* +// scripts need. Not .env: `next build` copies .env into the standalone output +// that `prisma deploy` uploads, and a local database URL has no business there. +try { + process.loadEnvFile(".env.local"); +} catch { + // no .env.local: use the environment as it is (CI, Composer deploys) +} + +export default definePrismaConfig({ + skills: { + agents: [], + }, + orm: ormConfig({ + contract: "./src/prisma/contract.prisma", + db: { + connection: process.env.DATABASE_URL!, + }, + }), + composer: composer({ + extensions: [prismaCloud({ region: "us-east-1" }), nodeBuild(), nextjsBuild()], + state: prismaState(), + }), +}); diff --git a/compute/room-booking-prisma-template/service.ts b/compute/room-booking-prisma-template/service.ts new file mode 100644 index 000000000000..8d69d9522ce6 --- /dev/null +++ b/compute/room-booking-prisma-template/service.ts @@ -0,0 +1,13 @@ +import nextjs from "@prisma/composer/nextjs"; +import { compute } from "@prisma/composer-prisma-cloud"; +import { postgres } from "@prisma/composer-prisma-cloud/orm"; + +import { appContract } from "./src/prisma/composer.ts"; + +export default compute({ + name: "app", + deps: { + database: postgres(appContract), + }, + build: nextjs({ module: import.meta.url, appDir: "." }), +}); diff --git a/compute/room-booking-prisma-template/src/app/about.tsx b/compute/room-booking-prisma-template/src/app/about.tsx new file mode 100644 index 000000000000..bec23da54dde --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/about.tsx @@ -0,0 +1,101 @@ +// What this template is and how it works, below the booking board. Delete this +// file and its use in page.tsx when the app is yours. + +export const SOURCE_URL = "https://github.com/prisma/prisma-examples/tree/latest/compute/room-booking-prisma-template"; +export const DEPLOY_URL = "https://console.prisma.io/apps/room-booking-prisma-template"; + +const steps = [ + { + where: "In your browser", + what: "The timeline runs the same rules as the server, so a taken slot or a time that has passed turns red before you let go.", + code: "bookingRules()", + }, + { + where: "On the server", + what: "A Prisma ORM transaction locks the room, reads its bookings again and checks the same rules. Two requests for one room take turns, and the second one is told what is in the way.", + code: "Room.where({ id }).forNoKeyUpdate()", + }, + { + where: "In Postgres", + what: "An exclusion constraint refuses two bookings of one room that overlap, even from a write that skips the app.", + code: "EXCLUDE USING gist", + }, +]; + +const stack = [ + { + name: "Prisma ORM 8", + what: "Typed queries and migrations from one schema contract. Every booking change runs in a transaction.", + href: "https://www.prisma.io/orm", + }, + { + name: "Prisma Postgres", + what: "Stores the rooms and bookings. Every deploy, preview and laptop gets a database of its own.", + href: "https://www.prisma.io/postgres", + }, + { + name: "Prisma Compute", + what: "Runs the Next.js server. module.ts declares the app and its database, and a deploy provisions both.", + href: "https://www.prisma.io/compute", + }, + { + name: "Resource Scheduler", + what: "The timeline: drag to book, move and resize.", + href: "https://www.npmjs.com/package/resource-scheduler", + }, +]; + +export function About({ rooms, bookings, queryMs }: { rooms: number; bookings: number; queryMs: number }) { + return ( + <> +
+

Why a room can never be booked twice

+

+ Every booking passes three checks on its way in. The last two hold when two people click the same slot at the + same moment. +

+
    + {steps.map((step) => ( +
  1. +

    {step.where}

    +

    {step.what}

    + {step.code} +
  2. + ))} +
+

The tests send 25 bookings for the same slot at once. Exactly one gets through.

+
+ +
+
+

Built on Prisma, end to end

+

+ This page read {rooms} rooms and {bookings} bookings from Prisma Postgres in {queryMs} ms. +

+ +

+ Setting it up with a coding agent? Point it at AGENTS.md: it covers setup, schema changes and + deploys. +

+
+
+ {stack.map((item) => ( +
+
+ {item.name} +
+
{item.what}
+
+ ))} +
+
+ + ); +} diff --git a/compute/room-booking-prisma-template/src/app/api/bookings/[id]/route.ts b/compute/room-booking-prisma-template/src/app/api/bookings/[id]/route.ts new file mode 100644 index 000000000000..a0411a626749 --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/api/bookings/[id]/route.ts @@ -0,0 +1,37 @@ +import { toBookingDTO } from "@/lib/api-types"; +import { moveBookingSchema } from "@/lib/validation"; +import { db } from "@/prisma/db"; +import { deleteBooking, moveBooking } from "@/server/bookings"; +import { errorResponse, fail, invalid, readJson } from "@/server/http"; + +// No sign-in in v1; see the note in ../route.ts. + +export const dynamic = "force-dynamic"; + +type Context = { params: Promise<{ id: string }> }; + +/** PATCH /api/bookings/:id { roomId, startsAt, endsAt }: move or resize. */ +export async function PATCH(request: Request, { params }: Context) { + const { id } = await params; + const body = await readJson(request); + if (body === undefined) return errorResponse("invalid", "Send the booking as a JSON body."); + const input = moveBookingSchema.safeParse(body); + if (!input.success) return invalid(input.error); + + try { + return Response.json(toBookingDTO(await moveBooking(db, id, input.data))); + } catch (error) { + return fail(error); + } +} + +/** DELETE /api/bookings/:id: cancel. */ +export async function DELETE(_request: Request, { params }: Context) { + const { id } = await params; + try { + await deleteBooking(db, id); + return new Response(null, { status: 204 }); + } catch (error) { + return fail(error); + } +} diff --git a/compute/room-booking-prisma-template/src/app/api/bookings/route.ts b/compute/room-booking-prisma-template/src/app/api/bookings/route.ts new file mode 100644 index 000000000000..8bbd08e15a56 --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/api/bookings/route.ts @@ -0,0 +1,40 @@ +import { toBookingDTO } from "@/lib/api-types"; +import { createBookingSchema, rangeSchema } from "@/lib/validation"; +import { db } from "@/prisma/db"; +import { createBooking, listBookings } from "@/server/bookings"; +import { errorResponse, fail, invalid, readJson } from "@/server/http"; + +// No sign-in in v1: anyone who can reach these routes can book, move and +// cancel anything. Before real use, check the user here (and in [id]/route.ts), +// store who booked, and let people change only their own bookings. + +export const dynamic = "force-dynamic"; + +/** GET /api/bookings?from=&to=: bookings that overlap the range (`to` exclusive). */ +export async function GET(request: Request) { + const params = new URL(request.url).searchParams; + const range = rangeSchema.safeParse({ from: params.get("from") ?? undefined, to: params.get("to") ?? undefined }); + if (!range.success) return invalid(range.error); + + try { + const bookings = await listBookings(db, range.data.from, range.data.to); + return Response.json(bookings.map(toBookingDTO)); + } catch (error) { + return fail(error); + } +} + +/** POST /api/bookings { roomId, title, booker, startsAt, endsAt } */ +export async function POST(request: Request) { + const body = await readJson(request); + if (body === undefined) return errorResponse("invalid", "Send the booking as a JSON body."); + const input = createBookingSchema.safeParse(body); + if (!input.success) return invalid(input.error); + + try { + const booking = await createBooking(db, input.data); + return Response.json(toBookingDTO(booking), { status: 201 }); + } catch (error) { + return fail(error); + } +} diff --git a/compute/room-booking-prisma-template/src/app/board.tsx b/compute/room-booking-prisma-template/src/app/board.tsx new file mode 100644 index 000000000000..73d1e3a2e2df --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/board.tsx @@ -0,0 +1,313 @@ +"use client"; + +import { useEffect, useMemo, useRef, useState } from "react"; +import { ResourceScheduler, ViewType } from "resource-scheduler"; +import type { Placement, ResourceInput, SchedulerEvent, VisibleRange } from "resource-scheduler"; +import "resource-scheduler/style.css"; + +import { ApiRequestError, api } from "@/lib/api-client"; +import type { BookingDTO, RoomDTO } from "@/lib/api-types"; +import { CLOSE_HOUR, OFFICE_TIME_ZONE, OPEN_HOUR, SLOT_MINUTES, formatOfficeTime } from "@/lib/office"; +import { bookingRules } from "@/lib/rules"; + +import { BookingDialog, rememberBooker } from "./booking-dialog"; +import type { BookingDetails, BookingDraft } from "./booking-dialog"; +import { RoomStatus } from "./room-status"; + +type Booking = { + id: string; + title: string; + booker: string; + roomId: string; + startsAt: Date; + endsAt: Date; + /** Shown but not saved yet: drawn grey, and cannot be moved until the server answers. */ + pending: boolean; +}; + +type Notice = { kind: "success" | "error"; text: string }; + +const PENDING_COLOR = "var(--pending)"; +const FLOOR_COLORS = 4; // --floor-1 to --floor-4 in globals.css, reused when there are more floors +const rules = bookingRules(); + +const fromDTO = (b: BookingDTO): Booking => ({ + ...b, + startsAt: new Date(b.startsAt), + endsAt: new Date(b.endsAt), + pending: false, +}); + +const messageOf = (error: unknown) => + error instanceof ApiRequestError ? error.message : "Something went wrong. Try again."; + +const isGone = (error: unknown) => error instanceof ApiRequestError && error.code === "not_found"; +const isConflict = (error: unknown) => error instanceof ApiRequestError && error.code === "conflict"; + +/** + * The calendar. Every change is optimistic: it shows at once, is sent to the + * API, and is rolled back with the server's message if the server refuses. + */ +export function Board({ + rooms, + initialBookings, + initialDate, + serverNow, +}: { + rooms: RoomDTO[]; + initialBookings: BookingDTO[]; + initialDate: string; + /** The server's clock at render, so the first paint of the room plates matches on both sides. */ + serverNow: string; +}) { + const [bookings, setBookings] = useState(() => initialBookings.map(fromDTO)); + const [start] = useState(() => new Date(initialDate)); + const [now, setNow] = useState(() => new Date(serverNow)); + const [draft, setDraft] = useState(null); + const [notice, setNotice] = useState(null); + const [loading, setLoading] = useState(false); + const visibleRange = useRef(null); + const loadController = useRef(null); + + // The room plates say "free" or "in use" on the minute. + useEffect(() => { + const timer = setInterval(() => setNow(new Date()), 15_000); + return () => clearInterval(timer); + }, []); + + // Success messages fade on their own; errors stay until dismissed. + useEffect(() => { + if (notice?.kind !== "success") return; + const timer = setTimeout(() => setNotice(null), 5_000); + return () => clearTimeout(timer); + }, [notice]); + + const roomName = (id: string) => rooms.find((r) => r.id === id)?.name ?? "the room"; + + // Every floor gets a color, like the signs in an office building, on its plates and its bookings. + const floorColor = useMemo(() => { + const floors = [...new Set(rooms.map((r) => r.floor))]; + return (floor: string) => `var(--floor-${(floors.indexOf(floor) % FLOOR_COLORS) + 1})`; + }, [rooms]); + + const resources = useMemo( + () => rooms.map((r) => ({ id: r.id, name: r.name, role: `${r.seats} seats`, group: r.floor })), + [rooms], + ); + + const events = useMemo(() => { + const floorOf = new Map(rooms.map((r) => [r.id, r.floor])); + return bookings.map((b) => ({ + id: b.id, + title: b.title, + description: `Booked by ${b.booker}`, + resourceId: b.roomId, + startDate: b.startsAt, + endDate: b.endsAt, + color: b.pending ? PENDING_COLOR : floorColor(floorOf.get(b.roomId) ?? ""), + })); + }, [bookings, rooms, floorColor]); + + // The shared rules, plus one that only matters in the browser: a booking + // that is still being saved cannot be moved yet. + const isValidDrop = (event: SchedulerEvent, placement: Placement) => + !bookings.some((b) => b.id === event.id && b.pending) && rules.isValidDrop(event, placement); + + async function book(slot: BookingDraft, details: BookingDetails) { + const tempId = `pending-${crypto.randomUUID()}`; + setDraft(null); + setNotice(null); + rememberBooker(details.booker); + setBookings((all) => [ + ...all, + { id: tempId, ...details, roomId: slot.resourceId, startsAt: slot.start, endsAt: slot.end, pending: true }, + ]); + + try { + const saved = await api.create({ roomId: slot.resourceId, startsAt: slot.start, endsAt: slot.end, ...details }); + setBookings((all) => all.map((b) => (b.id === tempId ? fromDTO(saved) : b))); + setNotice({ + kind: "success", + text: `Booked ${slot.roomName}, ${formatOfficeTime(slot.start)} to ${formatOfficeTime(slot.end)}.`, + }); + } catch (error) { + setBookings((all) => all.filter((b) => b.id !== tempId)); // roll back + setNotice({ kind: "error", text: messageOf(error) }); + if (isConflict(error)) void refresh(); // show what is in the way + if (error instanceof ApiRequestError && error.code === "invalid") { + setDraft({ ...slot, values: details, errors: error.fields }); // reopen the form with the server's messages + } + } + } + + /** Moving and resizing both end with a room and a new start and end. */ + async function reschedule(id: string, roomId: string, startsAt: Date, endsAt: Date) { + const before = bookings.find((b) => b.id === id); + if (!before || before.pending) return; + setNotice(null); + setBookings((all) => all.map((b) => (b.id === id ? { ...b, roomId, startsAt, endsAt, pending: true } : b))); + + try { + const saved = await api.move(id, { roomId, startsAt, endsAt }); + setBookings((all) => all.map((b) => (b.id === id ? fromDTO(saved) : b))); + } catch (error) { + setBookings((all) => + isGone(error) ? all.filter((b) => b.id !== id) : all.map((b) => (b.id === id ? before : b)), // roll back + ); + setNotice({ kind: "error", text: messageOf(error) }); + if (isConflict(error)) void refresh(); // show what is in the way + } + } + + async function cancel(id: string) { + const before = bookings.find((b) => b.id === id); + if (!before || before.pending) return; + setNotice(null); + setBookings((all) => all.filter((b) => b.id !== id)); + + try { + await api.cancel(id); + setNotice({ kind: "success", text: `Cancelled "${before.title}".` }); + } catch (error) { + if (isGone(error)) { + setNotice({ kind: "success", text: `"${before.title}" was already cancelled.` }); + return; + } + setBookings((all) => [...all, before]); // roll back + setNotice({ kind: "error", text: messageOf(error) }); + } + } + + /** Replaces the saved bookings of `range` with the server's, keeping unsaved ones. */ + async function fetchRange({ start: from, end: to }: VisibleRange) { + loadController.current?.abort(); + const controller = new AbortController(); + loadController.current = controller; + setLoading(true); + + try { + const fetched = (await api.list(from, to, controller.signal)).map(fromDTO); + setBookings((all) => { + const pending = all.filter((b) => b.pending); + const outside = all.filter((b) => !b.pending && (b.endsAt <= from || b.startsAt >= to)); + return [...outside, ...pending, ...fetched.filter((f) => !pending.some((p) => p.id === f.id))]; + }); + } catch (error) { + if (controller.signal.aborted) return; + setNotice({ kind: "error", text: messageOf(error) }); + } finally { + if (loadController.current === controller) setLoading(false); + } + } + + /** The grid moved to another day: load it. The first day came with the page. */ + function onRangeChange(range: VisibleRange) { + const first = visibleRange.current === null; + visibleRange.current = range; + if (!first) void fetchRange(range); + } + + /** Reloads the day on screen, after a conflict showed it is out of date. */ + async function refresh() { + if (visibleRange.current) await fetchRange(visibleRange.current); + } + + return ( + <> + setDraft({ resourceId: room.id, ...slot, roomName: room.name })} + /> + +
+

Timeline

+

+ Drag across free time to book. Drag a booking to move it, drag its edge to resize it, click it to cancel. + Times are {OFFICE_TIME_ZONE} time. +

+ {loading && ( + + Loading… + + )} +
+ +
+ {notice && ( +
+ {notice.text} + +
+ )} +
+ +
+ setDraft({ ...slot, roomName: roomName(slot.resourceId) })} + onEventDrop={(event, _fromRoom, toRoom, startsAt, endsAt) => reschedule(event.id, toRoom, startsAt, endsAt)} + onEventResize={(event, roomId, startsAt, endsAt) => reschedule(event.id, roomId, startsAt, endsAt)} + onRangeChange={onRangeChange} + renderEventPopover={(event, resource, close) => { + const booking = bookings.find((b) => b.id === event.id); + return ( +
+

{event.title}

+ {booking && ( +

+ {resource.name}, {formatOfficeTime(booking.startsAt)} to {formatOfficeTime(booking.endsAt)} +
+ Booked by {booking.booker} +

+ )} + {booking?.pending ? ( +

Saving…

+ ) : ( + + )} +
+ ); + }} + /> +
+ + {draft && ( + book(draft, details)} + onCancel={() => setDraft(null)} + /> + )} + + ); +} diff --git a/compute/room-booking-prisma-template/src/app/booking-dialog.tsx b/compute/room-booking-prisma-template/src/app/booking-dialog.tsx new file mode 100644 index 000000000000..402963290e6d --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/booking-dialog.tsx @@ -0,0 +1,142 @@ +"use client"; + +import { useEffect, useId, useRef, useState } from "react"; +import type { FormEvent } from "react"; +import type { SlotSelection } from "resource-scheduler"; + +import { OFFICE_TIME_ZONE, formatOfficeDay, formatOfficeTime } from "@/lib/office"; +import { bookingDetailsSchema, fieldErrors } from "@/lib/validation"; + +export type BookingDetails = { title: string; booker: string }; + +/** The free range the user selected, plus what to show in the form. */ +export type BookingDraft = SlotSelection & { + roomName: string; + values?: Partial; + /** Field errors from the server, when a save was refused and the form reopens. */ + errors?: Record; +}; + +const BOOKER_KEY = "room-booking:booker"; + +function rememberedBooker(): string { + try { + return localStorage.getItem(BOOKER_KEY) ?? ""; + } catch { + return ""; + } +} + +export function rememberBooker(name: string) { + try { + localStorage.setItem(BOOKER_KEY, name); + } catch { + // private mode or storage disabled: nothing to remember + } +} + +/** + * The app's own booking form, opened by `onSlotSelect`. It validates with the + * same zod schema as the server, so most mistakes never leave the browser. + */ +export function BookingDialog({ + draft, + onBook, + onCancel, +}: { + draft: BookingDraft; + onBook: (details: BookingDetails) => void; + onCancel: () => void; +}) { + const dialog = useRef(null); + const headingId = useId(); + const [errors, setErrors] = useState>(draft.errors ?? {}); + const [booker] = useState(() => draft.values?.booker ?? rememberedBooker()); + + useEffect(() => { + dialog.current?.showModal(); + }, []); + + function submit(event: FormEvent) { + event.preventDefault(); + const form = new FormData(event.currentTarget); + const details = bookingDetailsSchema.safeParse({ title: form.get("title"), booker: form.get("booker") }); + if (!details.success) { + setErrors(fieldErrors(details.error)); + return; + } + onBook(details.data); + } + + // Server errors about the slot itself (room, times) have no field in this form. + const otherErrors = Object.entries(errors) + .filter(([field]) => field !== "title" && field !== "booker") + .flatMap(([, messages]) => messages); + + return ( + +
+

Book {draft.roomName}

+

+ {formatOfficeDay(draft.start)}, {formatOfficeTime(draft.start)} to {formatOfficeTime(draft.end)} + ({OFFICE_TIME_ZONE}) +

+ + {otherErrors.length > 0 && ( +

+ {otherErrors.join(" ")} +

+ )} + + + + +
+ + +
+ +
+ ); +} + +function Field({ + name, + label, + errors, + ...input +}: { + name: string; + label: string; + errors?: string[]; + defaultValue?: string; + autoFocus?: boolean; + autoComplete?: string; +}) { + const id = useId(); + const errorId = `${id}-error`; + return ( +
+ + + {errors && ( +

+ {errors.join(" ")} +

+ )} +
+ ); +} diff --git a/compute/room-booking-prisma-template/src/app/globals.css b/compute/room-booking-prisma-template/src/app/globals.css new file mode 100644 index 000000000000..7a5edacf3b5a --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/globals.css @@ -0,0 +1,734 @@ +/* Page styles. The scheduler brings its own scoped stylesheet + (resource-scheduler/style.css) and is themed below with its --rs-* variables. */ + +:root { + color-scheme: light dark; + --paper: #f2f4f7; + --surface: #ffffff; + --ink: #172033; + --muted: #5a6476; + --line: #dde2ea; + --line-strong: #c6cdd8; + --action: #172033; + --action-fg: #ffffff; + --link: #4338ca; + --free: #11804f; + --busy: #c2410c; + --danger: #c0262d; + --pending: #94a3b8; + --mark: #172033; + /* One color per floor, for its plates and bookings. */ + --floor-1: #0b8783; + --floor-2: #5146d8; + --floor-3: #b86200; + --floor-4: #b4237f; + --radius: 10px; + --shadow: 0 1px 2px rgb(16 24 40 / 0.05), 0 12px 32px -16px rgb(16 24 40 / 0.18); +} + +@media (prefers-color-scheme: dark) { + :root { + --paper: #0d121b; + --surface: #151c28; + --ink: #e6eaf1; + --muted: #9aa5b6; + --line: #253042; + --line-strong: #344157; + --action: #e6eaf1; + --action-fg: #0d121b; + --link: #a9a3ff; + --free: #3ccf8e; + --busy: #fb8c4c; + --danger: #ff7a7f; + --pending: #64748b; + --mark: #222c3d; + --floor-1: #2cc4bd; + --floor-2: #8f86ff; + --floor-3: #f0a63a; + --floor-4: #ee6bbd; + --shadow: 0 1px 2px rgb(0 0 0 / 0.3), 0 12px 32px -16px rgb(0 0 0 / 0.6); + } +} + +/* The scheduler, in the page's colors. :root[data-theme] outranks the + package's own :root and [data-theme=system] rules in both modes. */ +:root[data-theme] { + --rs-background: var(--surface); + --rs-foreground: var(--ink); + --rs-card: var(--surface); + --rs-card-foreground: var(--ink); + --rs-popover: var(--surface); + --rs-popover-foreground: var(--ink); + --rs-primary: var(--link); + --rs-secondary: var(--paper); + --rs-secondary-foreground: var(--ink); + --rs-muted: var(--paper); + --rs-muted-foreground: var(--muted); + --rs-accent: color-mix(in srgb, var(--link) 12%, var(--surface)); + --rs-accent-foreground: var(--link); + --rs-destructive: var(--danger); + --rs-border: var(--line); + --rs-input: var(--line-strong); + --rs-ring: var(--link); + --rs-surface: var(--surface); + --rs-surface-muted: color-mix(in srgb, var(--paper) 55%, var(--surface)); + --rs-surface-hover: color-mix(in srgb, var(--link) 6%, var(--surface)); + --rs-today: var(--surface); + --rs-radius: var(--radius); +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--paper); + color: var(--ink); + font-family: var(--font-text), system-ui, sans-serif; + font-size: 1rem; + line-height: 1.5; + -webkit-font-smoothing: antialiased; +} + +h1, +h2, +h3 { + font-family: var(--font-display), var(--font-text), sans-serif; + font-weight: 700; + line-height: 1.1; + margin: 0; +} + +a { + color: var(--link); + text-underline-offset: 0.2em; +} + +code { + font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; + font-size: 0.8125rem; +} + +:focus-visible { + outline: 2px solid var(--link); + outline-offset: 2px; +} + +.muted { + color: var(--muted); +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; +} + +.shell { + max-width: 90rem; + margin: 0 auto; + padding: 0 clamp(1rem, 3vw, 2.5rem) 2.5rem; +} + +/* Top bar */ + +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + padding: 1rem 0; + border-bottom: 1px solid var(--line); +} + +.brand { + display: inline-flex; + align-items: center; + gap: 0.625rem; + color: var(--ink); + font-family: var(--font-display), sans-serif; + font-size: 1.375rem; + font-weight: 700; + text-decoration: none; +} + +.brand-mark { + width: 1.75rem; + height: 1.75rem; +} + +.topbar-nav { + display: flex; + align-items: center; + gap: 1.5rem; + font-size: 0.9375rem; +} + +.topbar-link { + color: var(--muted); + font-weight: 500; + text-decoration: none; +} + +.topbar-link:hover { + color: var(--ink); +} + +/* Intro */ + +.intro { + margin: clamp(1.75rem, 4vw, 3rem) 0 1.75rem; +} + +.intro h1 { + font-size: clamp(2.25rem, 1.6rem + 2.4vw, 3.5rem); + letter-spacing: -0.015em; +} + +.intro p { + max-width: 42rem; + margin: 0.625rem 0 0; + color: var(--muted); + font-size: 1.125rem; +} + +/* Right now: one plate per room */ + +.now { + margin-bottom: 2.5rem; +} + +.now-head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.25rem 1rem; + margin-bottom: 0.875rem; +} + +.now-head h2, +.board-head h2 { + font-size: 1.375rem; +} + +.clock { + margin: 0; + color: var(--muted); + font-variant-numeric: tabular-nums; +} + +.plates { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(10.5rem, 1fr)); + gap: 0.75rem; + margin: 0; + padding: 0; + list-style: none; +} + +.plate { + position: relative; + display: flex; + flex-direction: column; + gap: 0.125rem; + min-width: 0; + padding: 0.875rem 1rem 1rem 1.25rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + overflow: hidden; +} + +/* The floor's color down the left edge, like a wayfinding sign. */ +.plate::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 5px; + background: var(--floor); +} + +.plate-head { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 0.5rem; +} + +.plate-name { + font-family: var(--font-display), sans-serif; + font-size: 1.625rem; + font-weight: 700; + line-height: 1.1; +} + +.plate-seats, +.plate-floor { + color: var(--muted); + font-size: 0.8125rem; + white-space: nowrap; +} + +.plate-floor { + color: var(--floor); + font-weight: 600; +} + +.plate-status { + display: flex; + align-items: center; + gap: 0.5rem; + margin: 0.75rem 0 0; + font-weight: 600; + font-size: 0.9375rem; +} + +.plate-status::before { + content: ""; + flex: none; + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background: currentColor; +} + +.plate[data-state="free"] .plate-status { + color: var(--free); +} + +.plate[data-state="busy"] .plate-status { + color: var(--busy); +} + +.plate[data-state="closed"] .plate-status { + color: var(--muted); +} + +.plate-title { + margin: 0.125rem 0 0 1rem; + overflow: hidden; + color: var(--muted); + font-size: 0.875rem; + text-overflow: ellipsis; + white-space: nowrap; +} + +.plate-book { + align-self: flex-start; + margin-top: 0.75rem; +} + +/* Timeline */ + +.board-head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.25rem 1rem; + margin-bottom: 0.875rem; +} + +.board-head p { + flex: 1 1 24rem; + margin: 0; + font-size: 0.9375rem; +} + +.loading { + color: var(--muted); + font-size: 0.875rem; +} + +/* The scheduler fills its parent, so the parent needs a height. */ +.board-frame { + height: min(35rem, 78vh); + min-height: 26rem; + border: 1px solid var(--line); + border-radius: calc(var(--radius) + 2px); + background: var(--surface); + box-shadow: var(--shadow); + overflow: hidden; +} + +/* Messages after a change */ + +.toast-region { + position: fixed; + inset: auto 0 1.25rem; + z-index: 50; + display: flex; + justify-content: center; + padding: 0 1rem; + pointer-events: none; +} + +.toast { + display: flex; + align-items: center; + gap: 0.75rem; + max-width: 36rem; + padding: 0.625rem 0.625rem 0.625rem 1rem; + border: 1px solid var(--line-strong); + border-radius: var(--radius); + background: var(--surface); + box-shadow: var(--shadow); + font-size: 0.9375rem; + pointer-events: auto; + animation: toast-in 180ms ease-out; +} + +.toast::before { + content: ""; + flex: none; + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background: var(--free); +} + +.toast.error::before { + background: var(--danger); +} + +.toast-close { + flex: none; + width: 1.75rem; + height: 1.75rem; + border: 0; + border-radius: 6px; + background: none; + color: var(--muted); + font-size: 1.25rem; + line-height: 1; + cursor: pointer; +} + +.toast-close:hover { + background: var(--paper); + color: var(--ink); +} + +@keyframes toast-in { + from { + opacity: 0; + transform: translateY(0.5rem); + } +} + +@media (prefers-reduced-motion: reduce) { + .toast { + animation: none; + } +} + +/* Buttons */ + +.button { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.375rem; + padding: 0.5rem 1rem; + border: 1px solid var(--line-strong); + border-radius: 8px; + background: var(--surface); + color: var(--ink); + font: inherit; + font-size: 0.9375rem; + font-weight: 600; + text-decoration: none; + white-space: nowrap; + cursor: pointer; + transition: background-color 120ms, border-color 120ms; +} + +.button:hover { + background: color-mix(in srgb, var(--ink) 5%, var(--surface)); +} + +.button.primary { + border-color: var(--action); + background: var(--action); + color: var(--action-fg); +} + +.button.primary:hover { + background: color-mix(in srgb, var(--action) 86%, var(--paper)); +} + +.button.danger { + border-color: color-mix(in srgb, var(--danger) 45%, transparent); + color: var(--danger); +} + +.button.small { + min-height: 2rem; + padding: 0.25rem 0.75rem; + font-size: 0.875rem; +} + +/* Booking form */ + +.dialog { + width: min(28rem, calc(100vw - 2rem)); + padding: 1.5rem; + border: 1px solid var(--line); + border-radius: 14px; + background: var(--surface); + color: var(--ink); + box-shadow: 0 24px 64px -16px rgb(10 15 30 / 0.4); +} + +.dialog::backdrop { + background: rgb(13 18 27 / 0.5); +} + +.dialog h2 { + font-size: 1.75rem; +} + +.dialog-when { + margin: 0.375rem 0 1.25rem; + font-size: 0.9375rem; +} + +.field { + margin-bottom: 1rem; +} + +.field label { + display: block; + margin-bottom: 0.375rem; + font-size: 0.875rem; + font-weight: 600; +} + +.field input { + width: 100%; + padding: 0.625rem 0.75rem; + border: 1px solid var(--line-strong); + border-radius: 8px; + background: var(--paper); + color: var(--ink); + font: inherit; +} + +.field input:focus-visible { + outline-offset: 0; + border-color: var(--link); +} + +.field input[aria-invalid="true"] { + border-color: var(--danger); +} + +.field-error { + margin: 0.375rem 0 0; + color: var(--danger); + font-size: 0.8125rem; +} + +.dialog-actions { + display: flex; + justify-content: flex-end; + gap: 0.5rem; + margin-top: 1.5rem; +} + +/* A booking's details, opened from the timeline */ + +.details { + display: grid; + gap: 0.625rem; + font-size: 0.875rem; +} + +.details p { + margin: 0; +} + +.details-title { + font-family: var(--font-display), sans-serif; + font-size: 1.125rem; + font-weight: 700; +} + +/* How it works */ + +.how { + margin-top: clamp(3rem, 7vw, 5rem); + padding-top: clamp(2rem, 4vw, 3rem); + border-top: 1px solid var(--line); +} + +.how h2, +.stack h2 { + max-width: 40rem; + font-size: clamp(1.75rem, 1.4rem + 1.4vw, 2.5rem); + letter-spacing: -0.01em; +} + +.lede { + max-width: 40rem; + margin: 0.75rem 0 2rem; + color: var(--muted); + font-size: 1.0625rem; +} + +/* The three checks, in the order a booking meets them. */ +.steps { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); + gap: 1rem; + margin: 0; + padding: 0; + list-style: none; + counter-reset: step; +} + +.steps li { + display: flex; + flex-direction: column; + gap: 0.5rem; + padding: 1.25rem; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--surface); + counter-increment: step; +} + +.steps h3 { + display: flex; + align-items: center; + gap: 0.625rem; + font-size: 1.25rem; +} + +.steps h3::before { + content: counter(step); + display: grid; + place-items: center; + width: 1.75rem; + height: 1.75rem; + border-radius: 50%; + background: var(--ink); + color: var(--paper); + font-size: 0.9375rem; +} + +.steps p { + margin: 0; + color: var(--muted); +} + +.steps code { + align-self: flex-start; + margin-top: auto; + padding: 0.25rem 0.5rem; + border-radius: 6px; + background: var(--paper); + color: var(--ink); +} + +.proof { + margin: 1.25rem 0 0; + font-weight: 600; +} + +/* Built on Prisma */ + +.stack { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr)); + gap: 2rem clamp(2rem, 5vw, 5rem); + margin-top: clamp(3rem, 7vw, 5rem); + padding-top: clamp(2rem, 4vw, 3rem); + border-top: 1px solid var(--line); +} + +.live { + margin: 0.875rem 0 0; + color: var(--muted); + font-size: 1.0625rem; +} + +.live strong { + color: var(--ink); + font-variant-numeric: tabular-nums; +} + +.actions { + display: flex; + flex-wrap: wrap; + gap: 0.625rem; + margin-top: 1.5rem; +} + +.agent-note { + max-width: 30rem; + margin: 1.25rem 0 0; + color: var(--muted); + font-size: 0.9375rem; +} + +.stack-list { + margin: 0; +} + +.stack-list div { + display: grid; + grid-template-columns: 11rem 1fr; + gap: 0.25rem 1.5rem; + padding: 1rem 0; + border-bottom: 1px solid var(--line); +} + +.stack-list div:first-child { + padding-top: 0.25rem; +} + +.stack-list dt { + font-family: var(--font-display), sans-serif; + font-size: 1.125rem; + font-weight: 700; +} + +.stack-list dt a { + color: var(--ink); + text-decoration: none; +} + +.stack-list dt a:hover { + color: var(--link); +} + +.stack-list dd { + margin: 0; + color: var(--muted); +} + +.footer { + margin-top: clamp(3rem, 6vw, 4.5rem); + padding-top: 1.5rem; + border-top: 1px solid var(--line); + color: var(--muted); + font-size: 0.875rem; +} + +.footer p { + margin: 0; +} + +@media (max-width: 40rem) { + .topbar-link { + display: none; + } + + .stack-list div { + grid-template-columns: 1fr; + } +} diff --git a/compute/room-booking-prisma-template/src/app/icon.svg b/compute/room-booking-prisma-template/src/app/icon.svg new file mode 100644 index 000000000000..4c6f33ad683c --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/icon.svg @@ -0,0 +1 @@ + diff --git a/compute/room-booking-prisma-template/src/app/layout.tsx b/compute/room-booking-prisma-template/src/app/layout.tsx new file mode 100644 index 000000000000..341585afbb5a --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/layout.tsx @@ -0,0 +1,30 @@ +import type { Metadata, Viewport } from "next"; +import { Barlow, Barlow_Semi_Condensed } from "next/font/google"; + +import "./globals.css"; + +// Barlow is drawn after road and wayfinding signs, which is what a room board is. +const text = Barlow({ subsets: ["latin"], weight: ["400", "500", "600"], variable: "--font-text" }); +const display = Barlow_Semi_Condensed({ subsets: ["latin"], weight: ["600", "700"], variable: "--font-display" }); + +export const metadata: Metadata = { + title: "Rooms: meeting room booking on Prisma", + description: + "Book meeting rooms on a timeline, and never book the same room twice. A Next.js template on Prisma ORM, Prisma Postgres and Prisma Compute.", +}; + +export const viewport: Viewport = { + themeColor: [ + { media: "(prefers-color-scheme: light)", color: "#f2f4f7" }, + { media: "(prefers-color-scheme: dark)", color: "#0d121b" }, + ], +}; + +export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { + return ( + // data-theme="system": the scheduler follows the OS light or dark setting, like the page. + + {children} + + ); +} diff --git a/compute/room-booking-prisma-template/src/app/page.tsx b/compute/room-booking-prisma-template/src/app/page.tsx new file mode 100644 index 000000000000..42373dc1ccd1 --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/page.tsx @@ -0,0 +1,82 @@ +import Link from "next/link"; + +import { toBookingDTO } from "@/lib/api-types"; +import type { RoomDTO } from "@/lib/api-types"; +import { CLOSE_HOUR, OPEN_HOUR, officeTime } from "@/lib/office"; +import { db, ensureSeeded } from "@/prisma/db"; +import { listBookings } from "@/server/bookings"; + +import { About, DEPLOY_URL, SOURCE_URL } from "./about"; +import { Board } from "./board"; + +export const dynamic = "force-dynamic"; // read the database per request, not at build time + +/** The rooms and one day's bookings, and how long Prisma Postgres took to answer, for the page to show. */ +async function readDay(day: number, now: Date) { + const started = performance.now(); + const [rooms, bookings] = await Promise.all([ + db.orm.public.Room.orderBy([(r) => r.floor.asc(), (r) => r.name.asc()]).all(), + listBookings(db, officeTime(day, 0, 0, now), officeTime(day + 1, 0, 0, now)), + ]); + return { rooms, bookings, queryMs: Math.round(performance.now() - started) }; +} + +export default async function Page() { + await ensureSeeded(); // a fresh deploy gets the demo rooms on its first visit + + // Open on today, or on tomorrow once today's opening hours are over. + const now = new Date(); + const day = now >= officeTime(0, CLOSE_HOUR, 0, now) ? 1 : 0; + const initialDate = day === 0 ? now : officeTime(day, OPEN_HOUR, 0, now); + + const { rooms, bookings, queryMs } = await readDay(day, now); + + return ( +
+
+ + + Rooms + + +
+ +
+
+

Book a meeting room

+

Take a free room for the next half hour, or drag across the timeline to book any time.

+
+ + ({ id, name, floor, seats }))} + initialBookings={bookings.map(toBookingDTO)} + initialDate={initialDate.toISOString()} + serverNow={now.toISOString()} + /> + + +
+ +
+

+ Open source under the MIT license. Made by Mohammed Obaid with + Prisma ORM, Prisma Postgres and Prisma Compute. +

+
+
+ ); +} diff --git a/compute/room-booking-prisma-template/src/app/room-status.tsx b/compute/room-booking-prisma-template/src/app/room-status.tsx new file mode 100644 index 000000000000..7d49a3806288 --- /dev/null +++ b/compute/room-booking-prisma-template/src/app/room-status.tsx @@ -0,0 +1,91 @@ +import type { CSSProperties } from "react"; + +import type { RoomDTO } from "@/lib/api-types"; +import { CLOSE_HOUR, OFFICE_TIME_ZONE, OPEN_HOUR, SLOT_MINUTES, formatOfficeDay, formatOfficeTime, officeTime } from "@/lib/office"; +import { checkBookingRules, startOfCurrentSlot } from "@/lib/rules"; + +type Span = { roomId: string; title: string; startsAt: Date; endsAt: Date }; +type Slot = { start: Date; end: Date }; + +type Status = + | { state: "closed"; text: string } + | { state: "busy"; text: string; title: string } + | { state: "free"; text: string; slot: Slot | null }; + +/** What a sign on the room's door would say at `now`, on the office clock. */ +function statusOf(roomId: string, bookings: Span[], now: Date): Status { + const open = officeTime(0, OPEN_HOUR, 0, now); + const close = officeTime(0, CLOSE_HOUR, 0, now); + if (now < open) return { state: "closed", text: `Opens at ${formatOfficeTime(open)}` }; + if (now >= close) return { state: "closed", text: "Closed until tomorrow" }; + + const room = bookings.filter((b) => b.roomId === roomId); + const current = room.find((b) => b.startsAt <= now && b.endsAt > now); + if (current) return { state: "busy", text: `In use until ${formatOfficeTime(current.endsAt)}`, title: current.title }; + + const next = room.filter((b) => b.startsAt > now && b.startsAt < close).sort((a, b) => +a.startsAt - +b.startsAt)[0]; + // "Book now" offers the current slot, which the rules still accept. + const start = startOfCurrentSlot(now); + const end = new Date(start.getTime() + SLOT_MINUTES * 60_000); + const free = + !room.some((b) => b.startsAt < end && b.endsAt > start) && checkBookingRules({ start, end }, now) === null; + return { state: "free", text: `Free until ${formatOfficeTime(next?.startsAt ?? close)}`, slot: free ? { start, end } : null }; +} + +const city = OFFICE_TIME_ZONE.split("/").pop()!.replaceAll("_", " "); + +/** One plate per room, like the signs next to meeting room doors. */ +export function RoomStatus({ + rooms, + bookings, + now, + floorColor, + onBook, +}: { + rooms: RoomDTO[]; + bookings: Span[]; + now: Date; + floorColor: (floor: string) => string; + onBook: (room: RoomDTO, slot: Slot) => void; +}) { + return ( +
+
+

Right now

+ {/* Intl output can differ by a space between the server's runtime and the browser. */} +

+ {formatOfficeTime(now)} in {city}, {formatOfficeDay(now)} +

+
+ +
    + {rooms.map((room) => { + const status = statusOf(room.id, bookings, now); + return ( +
  • +
    + {room.name} + {room.seats} seats +
    + {room.floor} +

    + {status.text} +

    + {status.state === "busy" &&

    {status.title}

    } + {status.state === "free" && status.slot && ( + + )} +
  • + ); + })} +
+
+ ); +} diff --git a/compute/room-booking-prisma-template/src/lib/api-client.ts b/compute/room-booking-prisma-template/src/lib/api-client.ts new file mode 100644 index 000000000000..bec78c66bb2d --- /dev/null +++ b/compute/room-booking-prisma-template/src/lib/api-client.ts @@ -0,0 +1,50 @@ +import type { ApiError, ApiErrorCode, BookingDTO } from "./api-types.ts"; + +// The browser's side of the API: one function per route, and one error type +// that carries the server's code, message and field errors to the UI. + +export class ApiRequestError extends Error { + constructor( + readonly code: ApiErrorCode | "network", + message: string, + readonly fields?: Record, + ) { + super(message); + this.name = "ApiRequestError"; + } +} + +async function request(url: string, init: RequestInit = {}): Promise { + let response: Response; + try { + response = await fetch(url, { ...init, headers: { "Content-Type": "application/json", ...init.headers } }); + } catch (error) { + if (error instanceof DOMException && error.name === "AbortError") throw error; + throw new ApiRequestError("network", "Could not reach the server. Check your connection and try again."); + } + if (response.status === 204) return undefined as T; + + const body: unknown = await response.json().catch(() => null); + if (!response.ok) { + const error = (body as ApiError | null)?.error; + throw new ApiRequestError( + error?.code ?? "internal", + error?.message ?? `The server answered ${response.status}. Try again.`, + error?.fields, + ); + } + return body as T; +} + +type SlotBody = { roomId: string; startsAt: Date; endsAt: Date }; + +export const api = { + list: (from: Date, to: Date, signal?: AbortSignal) => + request(`/api/bookings?from=${from.toISOString()}&to=${to.toISOString()}`, { signal }), + // JSON.stringify turns each Date into an ISO string. + create: (body: SlotBody & { title: string; booker: string }) => + request("/api/bookings", { method: "POST", body: JSON.stringify(body) }), + move: (id: string, body: SlotBody) => + request(`/api/bookings/${encodeURIComponent(id)}`, { method: "PATCH", body: JSON.stringify(body) }), + cancel: (id: string) => request(`/api/bookings/${encodeURIComponent(id)}`, { method: "DELETE" }), +}; diff --git a/compute/room-booking-prisma-template/src/lib/api-types.ts b/compute/room-booking-prisma-template/src/lib/api-types.ts new file mode 100644 index 000000000000..6086a7a9c739 --- /dev/null +++ b/compute/room-booking-prisma-template/src/lib/api-types.ts @@ -0,0 +1,45 @@ +// What crosses the network. Dates travel as ISO strings. + +export type RoomDTO = { + id: string; + name: string; + floor: string; + seats: number; +}; + +export type BookingDTO = { + id: string; + title: string; + booker: string; + roomId: string; + startsAt: string; + endsAt: string; +}; + +export type ApiErrorCode = "invalid" | "rule" | "conflict" | "not_found" | "internal"; + +/** Every error response: 400 invalid, 404 not_found, 409 conflict, 422 rule, 500 internal. */ +export type ApiError = { + error: { + code: ApiErrorCode; + message: string; + /** For `invalid`: messages per field, e.g. `{ title: ["Give the booking a title."] }`. */ + fields?: Record; + }; +}; + +export const toBookingDTO = (b: { + id: string; + title: string; + booker: string; + roomId: string; + startsAt: Date; + endsAt: Date; +}): BookingDTO => ({ + id: b.id, + title: b.title, + booker: b.booker, + roomId: b.roomId, + startsAt: b.startsAt.toISOString(), + endsAt: b.endsAt.toISOString(), +}); diff --git a/compute/room-booking-prisma-template/src/lib/office.ts b/compute/room-booking-prisma-template/src/lib/office.ts new file mode 100644 index 000000000000..98047d57f498 --- /dev/null +++ b/compute/room-booking-prisma-template/src/lib/office.ts @@ -0,0 +1,41 @@ +import { utcToZoned, zonedToUtc } from "resource-scheduler/headless"; + +// The office the rooms are in. Booking times are shown, and the opening hours +// are checked, on this clock, in the browser and on the server alike, so a +// visitor in another zone and a server running in UTC agree on what "9:00" is. +// Change it to your office's IANA zone. +export const OFFICE_TIME_ZONE = "Europe/Berlin"; + +// Opening hours on the office clock: the first bookable hour, and the hour +// bookings must end by (exclusive, like every end in this app). +export const OPEN_HOUR = 8; +export const CLOSE_HOUR = 18; + +// The grid's slot length. Bookings may start at the current slot, not earlier. +export const SLOT_MINUTES = 30; + +/** The instant it is `hour:minute` on the office clock, `dayOffset` days from today there. */ +export function officeTime(dayOffset: number, hour: number, minute = 0, now = new Date()): Date { + const today = utcToZoned(now, OFFICE_TIME_ZONE); + const wallClock = new Date(today.getFullYear(), today.getMonth(), today.getDate() + dayOffset, hour, minute); + return zonedToUtc(wallClock, OFFICE_TIME_ZONE); +} + +/** Formats an instant as a time on the office clock, for messages: "9:30 AM". */ +export function formatOfficeTime(date: Date): string { + return new Intl.DateTimeFormat("en-US", { + timeZone: OFFICE_TIME_ZONE, + hour: "numeric", + minute: "2-digit", + }).format(date); +} + +/** Formats an instant as a day on the office clock: "Tue, Oct 27". */ +export function formatOfficeDay(date: Date): string { + return new Intl.DateTimeFormat("en-US", { + timeZone: OFFICE_TIME_ZONE, + weekday: "short", + month: "short", + day: "numeric", + }).format(date); +} diff --git a/compute/room-booking-prisma-template/src/lib/rules.ts b/compute/room-booking-prisma-template/src/lib/rules.ts new file mode 100644 index 000000000000..402edd7f0b86 --- /dev/null +++ b/compute/room-booking-prisma-template/src/lib/rules.ts @@ -0,0 +1,63 @@ +import { utcToZoned } from "resource-scheduler/headless"; +import type { Placement, PlacementRules } from "resource-scheduler/headless"; + +import { CLOSE_HOUR, OFFICE_TIME_ZONE, OPEN_HOUR, SLOT_MINUTES } from "./office.ts"; + +// The booking rules, in one place. The browser spreads `bookingRules()` onto +// , so a refused place turns red before the drop. The +// server hands the same object to `isPlacementAllowed` inside its +// transaction, so the two cannot disagree about what is allowed. +// +// Every rule here must give the same answer in the browser and on the server. +// That is why the opening hours are read on the office clock with +// `utcToZoned`, never with a bare `getHours()`, which would use whatever zone +// the machine running it is in. + +export type RuleViolation = "outside-opening-hours" | "in-the-past"; + +const minutesIntoDay = (d: Date) => d.getHours() * 60 + d.getMinutes(); +const sameDay = (a: Date, b: Date) => + a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate(); + +/** Whether `start` to `end` (exclusive) is inside the opening hours of one office day. */ +export function isWithinOpeningHours(start: Date, end: Date): boolean { + const s = utcToZoned(start, OFFICE_TIME_ZONE); + const e = utcToZoned(end, OFFICE_TIME_ZONE); + return sameDay(s, e) && minutesIntoDay(s) >= OPEN_HOUR * 60 && minutesIntoDay(e) <= CLOSE_HOUR * 60; +} + +/** The start of the slot `now` is in: bookings may start there, not earlier. */ +export function startOfCurrentSlot(now: Date): Date { + const slot = SLOT_MINUTES * 60_000; + return new Date(Math.floor(now.getTime() / slot) * slot); +} + +/** The first rule a placement breaks, or `null`. Overlap is checked separately. */ +export function checkBookingRules({ start, end }: Pick, now: Date): RuleViolation | null { + if (!isWithinOpeningHours(start, end)) return "outside-opening-hours"; + if (start < startOfCurrentSlot(now)) return "in-the-past"; + return null; +} + +const pad = (hour: number) => `${String(hour).padStart(2, "0")}:00`; + +export function describeViolation(violation: RuleViolation): string { + switch (violation) { + case "outside-opening-hours": + return `Rooms can be booked from ${pad(OPEN_HOUR)} to ${pad(CLOSE_HOUR)} office time (${OFFICE_TIME_ZONE}), within one day.`; + case "in-the-past": + return "That time has already started. Pick a time from the current half hour on."; + } +} + +/** + * The rules as `PlacementRules`: no two bookings of a room may overlap, and + * every booking must pass `checkBookingRules`. `now` is a function so the + * browser always uses the current time and tests can fix it. + */ +export function bookingRules(now: () => Date = () => new Date()) { + return { + eventOverlap: false, + isValidDrop: (_event, placement) => checkBookingRules(placement, now()) === null, + } satisfies PlacementRules; +} diff --git a/compute/room-booking-prisma-template/src/lib/validation.ts b/compute/room-booking-prisma-template/src/lib/validation.ts new file mode 100644 index 000000000000..cc7153dd97ef --- /dev/null +++ b/compute/room-booking-prisma-template/src/lib/validation.ts @@ -0,0 +1,62 @@ +import { z } from "zod"; + +// Input schemas, shared by the booking form in the browser and the route +// handlers on the server. Everything that arrives in a request body is +// untrusted, so the server parses it with these before anything else. + +const MAX_BOOKING_HOURS = 12; + +const instant = z.iso + .datetime({ offset: true, error: "Use an ISO 8601 date and time with a time zone." }) + .transform((value) => new Date(value)); + +export const bookingDetailsSchema = z.object({ + title: z + .string({ error: "Give the booking a title." }) + .trim() + .min(1, "Give the booking a title.") + .max(80, "Keep the title under 80 characters."), + booker: z + .string({ error: "Say who the booking is for." }) + .trim() + .min(1, "Say who the booking is for.") + .max(60, "Keep the name under 60 characters."), +}); + +const slotFields = z.object({ + roomId: z.string({ error: "Pick a room." }).min(1, "Pick a room.").max(64), + startsAt: instant, + endsAt: instant, +}); + +const slotIsValid = (slot: { startsAt: Date; endsAt: Date }, ctx: z.RefinementCtx) => { + // zod still runs this when a date failed to parse; that field already has its message. + if (!(slot.startsAt instanceof Date) || !(slot.endsAt instanceof Date)) return; + if (slot.endsAt <= slot.startsAt) { + ctx.addIssue({ code: "custom", path: ["endsAt"], message: "The booking must end after it starts." }); + } else if (slot.endsAt.getTime() - slot.startsAt.getTime() > MAX_BOOKING_HOURS * 3_600_000) { + ctx.addIssue({ code: "custom", path: ["endsAt"], message: `A booking can last at most ${MAX_BOOKING_HOURS} hours.` }); + } +}; + +/** POST /api/bookings */ +export const createBookingSchema = slotFields.extend(bookingDetailsSchema.shape).superRefine(slotIsValid); + +/** PATCH /api/bookings/:id (move or resize) */ +export const moveBookingSchema = slotFields.superRefine(slotIsValid); + +/** GET /api/bookings?from=&to= */ +export const rangeSchema = z.object({ from: instant, to: instant }).superRefine((range, ctx) => { + if (!(range.from instanceof Date) || !(range.to instanceof Date)) return; // see slotIsValid + if (range.to <= range.from) { + ctx.addIssue({ code: "custom", path: ["to"], message: "`to` must be after `from`." }); + } else if (range.to.getTime() - range.from.getTime() > 62 * 86_400_000) { + ctx.addIssue({ code: "custom", path: ["to"], message: "Ask for at most 62 days at a time." }); + } +}); + +export type CreateBookingInput = z.output; +export type MoveBookingInput = z.output; + +/** Field errors as `{ field: ["message", ...] }`, the shape the API returns. */ +export const fieldErrors = (error: z.ZodError) => z.flattenError(error).fieldErrors as Record; diff --git a/compute/room-booking-prisma-template/src/prisma/composer.ts b/compute/room-booking-prisma-template/src/prisma/composer.ts new file mode 100644 index 000000000000..c7cf401dadda --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/composer.ts @@ -0,0 +1,6 @@ +import { dataContract } from "@prisma/composer-prisma-cloud/orm"; + +import type { Contract } from "./contract.d.ts"; +import contractJson from "./contract.json" with { type: "json" }; + +export const appContract = dataContract(contractJson); diff --git a/compute/room-booking-prisma-template/src/prisma/contract.d.ts b/compute/room-booking-prisma-template/src/prisma/contract.d.ts new file mode 100644 index 000000000000..c164052af7b2 --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/contract.d.ts @@ -0,0 +1,656 @@ +// ⚠️ GENERATED FILE - DO NOT EDIT +// This file is automatically generated by 'prisma contract emit'. +// To regenerate, run: prisma contract emit +import type { CodecTypes as PgTypes } from '@prisma/orm-postgres/target/codec-types'; +import type { QueryOperationTypes as PgTargetQueryOps } from '@prisma/orm-postgres/target/operation-types'; + +import type { + ContractWithTypeMaps, + RelationKeys, + TypeMaps as TypeMapsType, +} from '@prisma/orm-postgres/family-contract/types'; +import type { + Contract as ContractType, + ExecutionHashBase, + NamespaceId, + ProfileHashBase, + StorageHashBase, +} from '@prisma/orm-postgres/contract/types'; + +export type StorageHash = + StorageHashBase<'dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2'>; +export type ExecutionHash = + ExecutionHashBase<'b9a096bcc0c24bca58765d4f5cff47e940b1a4b39c00aee407a38377c41dab2c'>; +export type ProfileHash = + ProfileHashBase<'3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2'>; + +export type CodecTypes = PgTypes; +export type LaneCodecTypes = CodecTypes; +export type QueryOperationTypes = PgTargetQueryOps; +export type AggregateTypes = { + readonly avg: { + readonly byCodec: { + readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + }; + }; + readonly avgDecimal: { + readonly byCodec: { + readonly 'pg/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + }; + }; + readonly count: { + readonly byCodec: {}; + readonly withoutInput: { readonly output: 'pg/int8number@1'; readonly nullable: false }; + readonly anyInput: { readonly output: 'pg/int8number@1'; readonly nullable: false }; + }; + readonly countBigInt: { + readonly byCodec: {}; + readonly withoutInput: { readonly output: 'pg/int8@1'; readonly nullable: false }; + readonly anyInput: { readonly output: 'pg/int8@1'; readonly nullable: false }; + }; + readonly max: { + readonly byCodec: { + readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true }; + readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true }; + readonly 'pg/date-temporal@1': { + readonly output: 'pg/date-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true }; + readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true }; + readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { + readonly output: 'pg/time-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-string@1': { + readonly output: 'pg/timestamp-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-temporal@1': { + readonly output: 'pg/timestamp-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-date@1': { + readonly output: 'pg/timestamptz-date@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-string@1': { + readonly output: 'pg/timestamptz-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-temporal@1': { + readonly output: 'pg/timestamptz-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true }; + readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true }; + readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + }; + }; + readonly min: { + readonly byCodec: { + readonly 'pg/char@1': { readonly output: 'pg/char@1'; readonly nullable: true }; + readonly 'pg/date-string@1': { readonly output: 'pg/date-string@1'; readonly nullable: true }; + readonly 'pg/date-temporal@1': { + readonly output: 'pg/date-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/enum@1': { readonly output: 'pg/enum@1'; readonly nullable: true }; + readonly 'pg/float@1': { readonly output: 'pg/float@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/inet@1': { readonly output: 'pg/inet@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int2@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int4@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/text-array@1': { readonly output: 'pg/text-array@1'; readonly nullable: true }; + readonly 'pg/text@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/time-string@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { + readonly output: 'pg/time-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-string@1': { + readonly output: 'pg/timestamp-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamp-temporal@1': { + readonly output: 'pg/timestamp-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-date@1': { + readonly output: 'pg/timestamptz-date@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-string@1': { + readonly output: 'pg/timestamptz-string@1'; + readonly nullable: true; + }; + readonly 'pg/timestamptz-temporal@1': { + readonly output: 'pg/timestamptz-temporal@1'; + readonly nullable: true; + }; + readonly 'pg/timetz@1': { readonly output: 'pg/timetz@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'pg/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + readonly 'sql/char@1': { readonly output: 'sql/char@1'; readonly nullable: true }; + readonly 'sql/float@1': { readonly output: 'sql/float@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'sql/int@1'; readonly nullable: true }; + readonly 'sql/text@1': { readonly output: 'sql/text@1'; readonly nullable: true }; + readonly 'sql/varchar@1': { readonly output: 'pg/text@1'; readonly nullable: true }; + }; + }; + readonly sum: { + readonly byCodec: { + readonly 'pg/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/float4@1': { readonly output: 'pg/float4@1'; readonly nullable: true }; + readonly 'pg/float8@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'pg/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + readonly 'pg/interval@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/numeric@1': { readonly output: 'pg/numeric@1'; readonly nullable: true }; + readonly 'pg/time-string@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/time-temporal@1': { readonly output: 'pg/interval@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'sql/float@1': { readonly output: 'pg/float8@1'; readonly nullable: true }; + readonly 'sql/int@1': { readonly output: 'pg/int8number@1'; readonly nullable: true }; + }; + }; + readonly sumBigInt: { + readonly byCodec: { + readonly 'pg/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int2@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int4@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + readonly 'pg/int8@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true }; + readonly 'pg/int8number@1': { readonly output: 'pg/unboundedint@1'; readonly nullable: true }; + readonly 'pg/unboundedint@1': { + readonly output: 'pg/unboundedint@1'; + readonly nullable: true; + }; + readonly 'sql/int@1': { readonly output: 'pg/int8@1'; readonly nullable: true }; + }; + }; +}; +type DefaultLiteralValue = CodecId extends keyof CodecTypes + ? Encoded extends CodecTypes[CodecId]['json'] + ? Encoded + : CodecTypes[CodecId]['json'] + : Encoded; + +export type FieldOutputTypes = { + readonly public: { + readonly Booking: { + readonly booker: CodecTypes['pg/text@1']['output']; + readonly createdAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly endsAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly id: CodecTypes['pg/text@1']['output']; + readonly roomId: CodecTypes['pg/text@1']['output']; + readonly startsAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly title: CodecTypes['pg/text@1']['output']; + }; + readonly Room: { + readonly floor: CodecTypes['pg/text@1']['output']; + readonly id: CodecTypes['pg/text@1']['output']; + readonly name: CodecTypes['pg/text@1']['output']; + readonly seats: CodecTypes['pg/int4@1']['output']; + }; + }; +}; +export type FieldInputTypes = { + readonly public: { + readonly Booking: { + readonly booker: CodecTypes['pg/text@1']['input']; + readonly createdAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly endsAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly id: CodecTypes['pg/text@1']['input']; + readonly roomId: CodecTypes['pg/text@1']['input']; + readonly startsAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly title: CodecTypes['pg/text@1']['input']; + }; + readonly Room: { + readonly floor: CodecTypes['pg/text@1']['input']; + readonly id: CodecTypes['pg/text@1']['input']; + readonly name: CodecTypes['pg/text@1']['input']; + readonly seats: CodecTypes['pg/int4@1']['input']; + }; + }; +}; +export type StorageColumnTypes = { + readonly public: { + readonly Booking: { + readonly booker: CodecTypes['pg/text@1']['output']; + readonly createdAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly endsAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly id: CodecTypes['pg/text@1']['output']; + readonly roomId: CodecTypes['pg/text@1']['output']; + readonly startsAt: CodecTypes['pg/timestamptz-date@1']['output']; + readonly title: CodecTypes['pg/text@1']['output']; + }; + readonly Room: { + readonly floor: CodecTypes['pg/text@1']['output']; + readonly id: CodecTypes['pg/text@1']['output']; + readonly name: CodecTypes['pg/text@1']['output']; + readonly seats: CodecTypes['pg/int4@1']['output']; + }; + }; +}; +export type StorageColumnInputTypes = { + readonly public: { + readonly Booking: { + readonly booker: CodecTypes['pg/text@1']['input']; + readonly createdAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly endsAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly id: CodecTypes['pg/text@1']['input']; + readonly roomId: CodecTypes['pg/text@1']['input']; + readonly startsAt: CodecTypes['pg/timestamptz-date@1']['input']; + readonly title: CodecTypes['pg/text@1']['input']; + }; + readonly Room: { + readonly floor: CodecTypes['pg/text@1']['input']; + readonly id: CodecTypes['pg/text@1']['input']; + readonly name: CodecTypes['pg/text@1']['input']; + readonly seats: CodecTypes['pg/int4@1']['input']; + }; + }; +}; + +export namespace Models { + export type public_Booking = { + booker: CodecTypes['pg/text@1']['output']; + createdAt: CodecTypes['pg/timestamptz-date@1']['output']; + endsAt: CodecTypes['pg/timestamptz-date@1']['output']; + id: CodecTypes['pg/text@1']['output']; + roomId: CodecTypes['pg/text@1']['output']; + startsAt: CodecTypes['pg/timestamptz-date@1']['output']; + title: CodecTypes['pg/text@1']['output']; + room: public_Room; + readonly [RelationKeys]?: 'room'; + }; + export type public_Room = { + floor: CodecTypes['pg/text@1']['output']; + id: CodecTypes['pg/text@1']['output']; + name: CodecTypes['pg/text@1']['output']; + seats: CodecTypes['pg/int4@1']['output']; + bookings: public_Booking[]; + readonly [RelationKeys]?: 'bookings'; + }; +} + +export declare const models: { + public: { + Booking: Models.public_Booking; + Room: Models.public_Room; + }; +}; + +export type TypeMaps = TypeMapsType< + CodecTypes, + QueryOperationTypes, + FieldOutputTypes, + FieldInputTypes, + StorageColumnTypes, + StorageColumnInputTypes, + AggregateTypes +>; + +type ContractBase = Omit< + ContractType<{ + readonly namespaces: { + readonly public: { + readonly id: 'public'; + readonly kind: 'postgres-schema'; + readonly entries: { + readonly table: { + readonly Booking: { + columns: { + readonly booker: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly createdAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly default: { readonly kind: 'function'; readonly expression: 'now()' }; + readonly many: false; + }; + readonly endsAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly many: false; + }; + readonly id: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly roomId: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly startsAt: { + readonly dataType: 'pg/timestamptz'; + readonly codecId: 'pg/timestamptz-date@1'; + readonly nullable: false; + readonly many: false; + }; + readonly title: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + }; + primaryKey: { readonly columns: readonly ['id'] }; + uniques: readonly []; + indexes: readonly [ + { + readonly name: 'Booking_roomId_idx_fe51d647'; + readonly prefix: 'Booking_roomId_idx'; + readonly columns: readonly ['roomId']; + readonly unique: false; + }, + { + readonly name: 'Booking_roomId_startsAt_idx_4f44cd3f'; + readonly prefix: 'Booking_roomId_startsAt_idx'; + readonly columns: readonly ['roomId', 'startsAt']; + readonly unique: false; + }, + ]; + foreignKeys: readonly [ + { + readonly source: { + readonly namespaceId: 'public' & NamespaceId; + readonly tableName: 'Booking'; + readonly columns: readonly ['roomId']; + }; + readonly target: { + readonly namespaceId: 'public' & NamespaceId; + readonly tableName: 'Room'; + readonly columns: readonly ['id']; + }; + }, + ]; + }; + readonly Room: { + columns: { + readonly floor: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly id: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly name: { + readonly dataType: 'pg/text'; + readonly codecId: 'pg/text@1'; + readonly nullable: false; + readonly many: false; + }; + readonly seats: { + readonly dataType: 'pg/int4'; + readonly codecId: 'pg/int4@1'; + readonly nullable: false; + readonly many: false; + }; + }; + primaryKey: { readonly columns: readonly ['id'] }; + uniques: readonly [{ readonly columns: readonly ['name'] }]; + indexes: readonly []; + foreignKeys: readonly []; + }; + }; + }; + }; + }; + readonly storageHash: StorageHash; + }>, + 'roots' | 'domain' +> & { + readonly target: 'postgres'; + readonly targetFamily: 'sql'; + readonly roots: { + readonly Booking: { readonly namespace: 'public' & NamespaceId; readonly model: 'Booking' }; + readonly Room: { readonly namespace: 'public' & NamespaceId; readonly model: 'Room' }; + }; + readonly domain: { + readonly namespaces: { + readonly public: { + readonly models: { + readonly Booking: { + readonly fields: { + readonly booker: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly createdAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly endsAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly id: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly roomId: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly startsAt: { + readonly nullable: false; + readonly type: { + readonly kind: 'scalar'; + readonly codecId: 'pg/timestamptz-date@1'; + }; + }; + readonly title: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + }; + readonly relations: { + readonly room: { + readonly to: { readonly namespace: 'public' & NamespaceId; readonly model: 'Room' }; + readonly cardinality: 'N:1'; + readonly nullable: false; + readonly on: { + readonly localFields: readonly ['roomId']; + readonly targetFields: readonly ['id']; + }; + }; + }; + readonly storage: { + readonly table: 'Booking'; + readonly namespaceId: 'public'; + readonly fields: { + readonly booker: { readonly column: 'booker' }; + readonly createdAt: { readonly column: 'createdAt' }; + readonly endsAt: { readonly column: 'endsAt' }; + readonly id: { readonly column: 'id' }; + readonly roomId: { readonly column: 'roomId' }; + readonly startsAt: { readonly column: 'startsAt' }; + readonly title: { readonly column: 'title' }; + }; + }; + }; + readonly Room: { + readonly fields: { + readonly floor: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly id: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly name: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/text@1' }; + }; + readonly seats: { + readonly nullable: false; + readonly type: { readonly kind: 'scalar'; readonly codecId: 'pg/int4@1' }; + }; + }; + readonly relations: { + readonly bookings: { + readonly to: { + readonly namespace: 'public' & NamespaceId; + readonly model: 'Booking'; + }; + readonly cardinality: '1:N'; + readonly on: { + readonly localFields: readonly ['id']; + readonly targetFields: readonly ['roomId']; + }; + }; + }; + readonly storage: { + readonly table: 'Room'; + readonly namespaceId: 'public'; + readonly fields: { + readonly floor: { readonly column: 'floor' }; + readonly id: { readonly column: 'id' }; + readonly name: { readonly column: 'name' }; + readonly seats: { readonly column: 'seats' }; + }; + }; + }; + }; + }; + }; + }; + readonly capabilities: { + readonly postgres: { + readonly distinctOn: true; + readonly forKeyShare: true; + readonly forNoKeyUpdate: true; + readonly jsonAgg: true; + readonly lateral: true; + readonly limit: true; + readonly orderBy: true; + readonly returning: true; + }; + readonly sql: { + readonly checkConstraint: true; + readonly defaultInInsert: true; + readonly enums: true; + readonly forShare: true; + readonly forUpdate: true; + readonly insertOnConflictSkip: true; + readonly insertOnConflictWithoutTarget: true; + readonly lateral: true; + readonly lockNowait: true; + readonly lockOf: true; + readonly lockSkipLocked: true; + readonly returning: true; + readonly scalarList: true; + }; + }; + readonly extensions: {}; + readonly execution: { + readonly executionHash: ExecutionHash; + readonly mutations: { + readonly defaults: readonly [ + { + readonly onCreate: { readonly id: 'cuid2'; readonly kind: 'generator' }; + readonly ref: { + readonly entry: 'Booking'; + readonly field: 'id'; + readonly namespace: 'public'; + }; + }, + { + readonly onCreate: { readonly id: 'cuid2'; readonly kind: 'generator' }; + readonly ref: { + readonly entry: 'Room'; + readonly field: 'id'; + readonly namespace: 'public'; + }; + }, + ]; + }; + }; + readonly meta: {}; + + readonly profileHash: ProfileHash; +}; + +export type Contract = ContractWithTypeMaps; + +export type Namespaces = Contract['storage']['namespaces']; diff --git a/compute/room-booking-prisma-template/src/prisma/contract.json b/compute/room-booking-prisma-template/src/prisma/contract.json new file mode 100644 index 000000000000..3829ef497025 --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/contract.json @@ -0,0 +1,400 @@ +{ + "schemaVersion": "1", + "targetFamily": "sql", + "target": "postgres", + "profileHash": "3916f444a8a17ad749191acf9e08dad97d1a327b88c2f1d45d12f240296aa8b2", + "roots": { + "Booking": { + "model": "Booking", + "namespace": "public" + }, + "Room": { + "model": "Room", + "namespace": "public" + } + }, + "domain": { + "namespaces": { + "public": { + "models": { + "Booking": { + "fields": { + "booker": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "createdAt": { + "nullable": false, + "type": { + "codecId": "pg/timestamptz-date@1", + "kind": "scalar" + } + }, + "endsAt": { + "nullable": false, + "type": { + "codecId": "pg/timestamptz-date@1", + "kind": "scalar" + } + }, + "id": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "roomId": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "startsAt": { + "nullable": false, + "type": { + "codecId": "pg/timestamptz-date@1", + "kind": "scalar" + } + }, + "title": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + } + }, + "relations": { + "room": { + "cardinality": "N:1", + "nullable": false, + "on": { + "localFields": [ + "roomId" + ], + "targetFields": [ + "id" + ] + }, + "to": { + "model": "Room", + "namespace": "public" + } + } + }, + "storage": { + "fields": { + "booker": { + "column": "booker" + }, + "createdAt": { + "column": "createdAt" + }, + "endsAt": { + "column": "endsAt" + }, + "id": { + "column": "id" + }, + "roomId": { + "column": "roomId" + }, + "startsAt": { + "column": "startsAt" + }, + "title": { + "column": "title" + } + }, + "namespaceId": "public", + "table": "Booking" + } + }, + "Room": { + "fields": { + "floor": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "id": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "name": { + "nullable": false, + "type": { + "codecId": "pg/text@1", + "kind": "scalar" + } + }, + "seats": { + "nullable": false, + "type": { + "codecId": "pg/int4@1", + "kind": "scalar" + } + } + }, + "relations": { + "bookings": { + "cardinality": "1:N", + "on": { + "localFields": [ + "id" + ], + "targetFields": [ + "roomId" + ] + }, + "to": { + "model": "Booking", + "namespace": "public" + } + } + }, + "storage": { + "fields": { + "floor": { + "column": "floor" + }, + "id": { + "column": "id" + }, + "name": { + "column": "name" + }, + "seats": { + "column": "seats" + } + }, + "namespaceId": "public", + "table": "Room" + } + } + } + } + } + }, + "storage": { + "namespaces": { + "public": { + "entries": { + "table": { + "Booking": { + "checks": [ + { + "expression": "\"endsAt\" > \"startsAt\"", + "name": "booking_ends_after_start_20c1ac54", + "prefix": "booking_ends_after_start" + } + ], + "columns": { + "booker": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "createdAt": { + "codecId": "pg/timestamptz-date@1", + "dataType": "pg/timestamptz", + "default": { + "expression": "now()", + "kind": "function" + }, + "nullable": false + }, + "endsAt": { + "codecId": "pg/timestamptz-date@1", + "dataType": "pg/timestamptz", + "nullable": false + }, + "id": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "roomId": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "startsAt": { + "codecId": "pg/timestamptz-date@1", + "dataType": "pg/timestamptz", + "nullable": false + }, + "title": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + } + }, + "foreignKeys": [ + { + "index": { + "name": "Booking_roomId_idx_fe51d647" + }, + "onDelete": "cascade", + "source": { + "columns": [ + "roomId" + ], + "namespaceId": "public", + "tableName": "Booking" + }, + "target": { + "columns": [ + "id" + ], + "namespaceId": "public", + "tableName": "Room" + } + } + ], + "indexes": [ + { + "columns": [ + "roomId" + ], + "name": "Booking_roomId_idx_fe51d647", + "prefix": "Booking_roomId_idx", + "unique": false + }, + { + "columns": [ + "roomId", + "startsAt" + ], + "name": "Booking_roomId_startsAt_idx_4f44cd3f", + "prefix": "Booking_roomId_startsAt_idx", + "unique": false + } + ], + "primaryKey": { + "columns": [ + "id" + ] + }, + "uniques": [] + }, + "Room": { + "columns": { + "floor": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "id": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "name": { + "codecId": "pg/text@1", + "dataType": "pg/text", + "nullable": false + }, + "seats": { + "codecId": "pg/int4@1", + "dataType": "pg/int4", + "nullable": false + } + }, + "foreignKeys": [], + "indexes": [], + "primaryKey": { + "columns": [ + "id" + ] + }, + "uniques": [ + { + "columns": [ + "name" + ] + } + ] + } + } + }, + "id": "public", + "kind": "postgres-schema" + } + }, + "storageHash": "dc5ac85f4f56b1db685a838b5de651b19189a27ccfbbb3fe4e7e64752be834e2" + }, + "execution": { + "executionHash": "b9a096bcc0c24bca58765d4f5cff47e940b1a4b39c00aee407a38377c41dab2c", + "mutations": { + "defaults": [ + { + "onCreate": { + "id": "cuid2", + "kind": "generator" + }, + "ref": { + "entry": "Booking", + "field": "id", + "namespace": "public" + } + }, + { + "onCreate": { + "id": "cuid2", + "kind": "generator" + }, + "ref": { + "entry": "Room", + "field": "id", + "namespace": "public" + } + } + ] + } + }, + "capabilities": { + "postgres": { + "distinctOn": true, + "forKeyShare": true, + "forNoKeyUpdate": true, + "jsonAgg": true, + "lateral": true, + "limit": true, + "orderBy": true, + "returning": true + }, + "sql": { + "checkConstraint": true, + "defaultInInsert": true, + "enums": true, + "forShare": true, + "forUpdate": true, + "insertOnConflictSkip": true, + "insertOnConflictWithoutTarget": true, + "lateral": true, + "lockNowait": true, + "lockOf": true, + "lockSkipLocked": true, + "returning": true, + "scalarList": true + } + }, + "extensions": {}, + "meta": {}, + "_generated": { + "warning": "⚠️ GENERATED FILE - DO NOT EDIT", + "message": "This file is automatically generated by \"prisma contract emit\".", + "regenerate": "To regenerate, run: prisma contract emit" + } +} \ No newline at end of file diff --git a/compute/room-booking-prisma-template/src/prisma/contract.prisma b/compute/room-booking-prisma-template/src/prisma/contract.prisma new file mode 100644 index 000000000000..464a1f9cb6dc --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/contract.prisma @@ -0,0 +1,27 @@ +// use prisma-8 + +// A meeting room: one row of the scheduler. +model Room { + id String @id @default(cuid(2)) + name String @unique + floor String + seats Int + bookings Booking[] +} + +// One booking of one room. `endsAt` is exclusive: a booking that ends at 10:00 +// does not collide with one that starts at 10:00, the same rule the scheduler +// uses. Times are `timestamptz`, read in the app as JavaScript `Date`s. +model Booking { + id String @id @default(cuid(2)) + title String + booker String + room Room @relation(fields: [roomId], references: [id], onDelete: Cascade) + roomId String + startsAt TimestamptzJsDate + endsAt TimestamptzJsDate + createdAt TimestamptzJsDate @default(now()) + + @@index([roomId, startsAt]) + @@check(expression: "\"endsAt\" > \"startsAt\"", name: "booking_ends_after_start") +} diff --git a/compute/room-booking-prisma-template/src/prisma/db.ts b/compute/room-booking-prisma-template/src/prisma/db.ts new file mode 100644 index 000000000000..612551da8093 --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/db.ts @@ -0,0 +1,40 @@ +import postgres from "@prisma/orm-postgres/runtime"; + +import "temporal-polyfill/global"; + +import service from "../../service.ts"; +import type { Contract } from "./contract.d.ts"; +import contractJson from "./contract.json" with { type: "json" }; +import { seedIfEmpty } from "./seed.ts"; + +// On Prisma Compute, and under `prisma dev module.ts`, Composer hands the +// service a client for the database declared in module.ts. Under plain +// `next dev`, tests and scripts there is no Composer, so fall back to +// DATABASE_URL. +function loadComposerDatabase() { + try { + return service.load().database.client; + } catch { + return undefined; + } +} + +export const db = + loadComposerDatabase() ?? + (process.env.DATABASE_URL + ? postgres({ contractJson, url: process.env.DATABASE_URL }) + : postgres({ contractJson })); + +export type Db = typeof db; +export type Tx = Parameters[0]>[0]; + +let seeding: Promise | undefined; + +/** Seeds the demo data on the first call in this process if the database is empty. */ +export function ensureSeeded(): Promise { + seeding ??= seedIfEmpty(db).catch((error: unknown) => { + seeding = undefined; // try again on the next request + throw error; + }); + return seeding; +} diff --git a/compute/room-booking-prisma-template/src/prisma/seed-cli.ts b/compute/room-booking-prisma-template/src/prisma/seed-cli.ts new file mode 100644 index 000000000000..8a9d6e5b4bdd --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/seed-cli.ts @@ -0,0 +1,17 @@ +// npm run db:seed insert the demo rooms and bookings if there are no rooms +// npm run db:seed -- --reset delete every room and booking, then insert the demo data +import { db } from "./db.ts"; +import { reseed, seedIfEmpty } from "./seed.ts"; + +try { + if (process.argv.includes("--reset")) { + await reseed(db); + console.log("Deleted all rooms and bookings and inserted the demo data."); + } else if (await seedIfEmpty(db)) { + console.log("Inserted the demo rooms and bookings."); + } else { + console.log("The database already has rooms; nothing to do. Pass --reset to start over."); + } +} finally { + await db.close(); +} diff --git a/compute/room-booking-prisma-template/src/prisma/seed.ts b/compute/room-booking-prisma-template/src/prisma/seed.ts new file mode 100644 index 000000000000..cd4374e54b1a --- /dev/null +++ b/compute/room-booking-prisma-template/src/prisma/seed.ts @@ -0,0 +1,77 @@ +import { officeTime } from "../lib/office.ts"; +import type { Db, Tx } from "./db.ts"; + +const rooms = [ + { name: "Atlas", floor: "Floor 1", seats: 8 }, + { name: "Borealis", floor: "Floor 1", seats: 4 }, + { name: "Cirrus", floor: "Floor 1", seats: 12 }, + { name: "Delta", floor: "Floor 2", seats: 6 }, + { name: "Echo", floor: "Floor 2", seats: 2 }, + { name: "Fjord", floor: "Floor 2", seats: 20 }, +]; + +// [room, day (0 = today), start "HH:MM", end "HH:MM", title, booker], on the office clock. +const bookings: [string, number, string, string, string, string][] = [ + ["Atlas", 0, "09:00", "09:30", "Daily standup", "Priya"], + ["Atlas", 0, "10:00", "11:30", "Sprint planning", "Jonas"], + ["Atlas", 0, "14:00", "15:00", "Customer call", "Amara"], + ["Borealis", 0, "09:30", "10:30", "1:1 Lena and Sam", "Lena"], + ["Borealis", 0, "13:00", "13:30", "Interview: frontend", "Sam"], + ["Cirrus", 0, "11:00", "12:30", "Design review", "Mei"], + ["Cirrus", 0, "15:30", "17:00", "All-hands prep", "Diego"], + ["Delta", 0, "08:30", "09:30", "Ops sync", "Tomás"], + ["Delta", 0, "12:00", "13:00", "Lunch and learn", "Priya"], + ["Echo", 0, "10:00", "10:30", "Vendor call", "Jonas"], + ["Echo", 0, "16:00", "16:30", "Recruiter screen", "Amara"], + ["Fjord", 0, "13:30", "15:30", "Quarterly business review", "Diego"], + ["Atlas", 1, "09:00", "09:30", "Daily standup", "Priya"], + ["Fjord", 1, "10:00", "12:00", "Board prep", "Mei"], + ["Cirrus", 1, "14:00", "15:00", "Retro", "Jonas"], +]; + +// Any constant works; it only has to be the same for every caller. +const SEED_LOCK = 72_406_001; + +const at = (day: number, hhmm: string, now: Date) => { + const [hour, minute] = hhmm.split(":").map(Number); + return officeTime(day, hour, minute, now); +}; + +async function insertDemoData(tx: Tx, now: Date) { + const created = await tx.orm.public.Room.createAll(rooms); + const roomId = new Map(created.map((room) => [room.name, room.id])); + await tx.orm.public.Booking.createAll( + bookings.map(([room, day, start, end, title, booker]) => ({ + roomId: roomId.get(room)!, + startsAt: at(day, start, now), + endsAt: at(day, end, now), + title, + booker, + })), + ); +} + +/** + * Inserts the demo rooms and bookings when the database has no rooms yet, and + * does nothing otherwise. Safe to call from every request: an advisory lock + * makes concurrent first calls wait for each other, so only one inserts. + * Returns whether it inserted anything. + */ +export async function seedIfEmpty(db: Db, now = new Date()): Promise { + return db.transaction(async (tx) => { + await tx.execute(db.raw.sql`SELECT pg_advisory_xact_lock(${SEED_LOCK})`.affectedCount().build()); + if (await tx.orm.public.Room.select("id").first()) return false; + await insertDemoData(tx, now); + return true; + }); +} + +/** Deletes every booking and room, then inserts the demo data again. */ +export async function reseed(db: Db, now = new Date()): Promise { + await db.transaction(async (tx) => { + await tx.execute(db.raw.sql`SELECT pg_advisory_xact_lock(${SEED_LOCK})`.affectedCount().build()); + await tx.orm.public.Booking.where((b) => b.id.isNotNull()).deleteAndCount(); + await tx.orm.public.Room.where((r) => r.id.isNotNull()).deleteAndCount(); + await insertDemoData(tx, now); + }); +} diff --git a/compute/room-booking-prisma-template/src/server/bookings.ts b/compute/room-booking-prisma-template/src/server/bookings.ts new file mode 100644 index 000000000000..a78a83f52014 --- /dev/null +++ b/compute/room-booking-prisma-template/src/server/bookings.ts @@ -0,0 +1,164 @@ +import { isPlacementAllowed } from "resource-scheduler/headless"; +import type { Resource, SchedulerEvent } from "resource-scheduler/headless"; + +import { formatOfficeTime } from "../lib/office.ts"; +import { bookingRules, checkBookingRules, describeViolation } from "../lib/rules.ts"; +import type { CreateBookingInput, MoveBookingInput } from "../lib/validation.ts"; +import type { Db, Tx } from "../prisma/db.ts"; + +// The server decides. The browser already refused overlaps before the drop, +// but two people can pick the same free slot at the same moment, and anyone +// can call the API without the UI. So every write: +// +// 1. opens a transaction, +// 2. locks the room row(s) it touches (`FOR NO KEY UPDATE`, in id order so two +// moves between the same rooms cannot deadlock), which makes every other +// write to those rooms wait until this one commits or rolls back, +// 3. reads the room's bookings that overlap the new time, +// 4. asks `isPlacementAllowed` from resource-scheduler/headless, with the same +// rules the browser used, and +// 5. writes, or throws a BookingError that the route turns into a 409 or 422. +// +// Prisma ORM 8 has no isolation-level option yet, so instead of the +// Serializable transaction of the original tutorial the lock in step 2 is +// what makes check-then-write safe under the default READ COMMITTED. The +// exclusion constraint in the init migration is a second line of defence in +// Postgres itself; with the lock it should never fire. + +export type BookingErrorCode = "rule" | "conflict" | "not_found"; + +export class BookingError extends Error { + constructor( + readonly code: BookingErrorCode, + message: string, + ) { + super(message); + this.name = "BookingError"; + } +} + +type Slot = { roomId: string; startsAt: Date; endsAt: Date }; +type BookingRow = { id: string; title: string; roomId: string; startsAt: Date; endsAt: Date }; + +const toEvent = (b: BookingRow): SchedulerEvent => ({ + id: b.id, + title: b.title, + resourceId: b.roomId, + startDate: b.startsAt, + endDate: b.endsAt, +}); + +/** Locks the rooms (in id order) for the rest of the transaction. Throws `not_found` for a missing one. */ +async function lockRooms(tx: Tx, ids: string[]) { + const rooms = new Map(); + for (const id of [...new Set(ids)].sort()) { + const room = await tx.orm.public.Room.where({ id }).forNoKeyUpdate().first(); + if (!room) throw new BookingError("not_found", "That room does not exist."); + rooms.set(room.id, room); + } + return rooms; +} + +/** Throws unless `moving` may take `slot` in `room`. Call it with the room locked. */ +async function assertPlacementAllowed(tx: Tx, room: { id: string; name: string }, moving: SchedulerEvent, slot: Slot, now: Date) { + const placement = { resourceId: room.id, start: slot.startsAt, end: slot.endsAt }; + + // Explain a rule break in words; isPlacementAllowed below only says yes or no. + const violation = checkBookingRules(placement, now); + if (violation) throw new BookingError("rule", describeViolation(violation)); + + const overlapping = await tx.orm.public.Booking.where({ roomId: room.id }) + .where((b) => b.startsAt.lt(slot.endsAt)) + .where((b) => b.endsAt.gt(slot.startsAt)) + .orderBy((b) => b.startsAt.asc()) + .all(); + const resource: Resource = { id: room.id, name: room.name, events: overlapping.map(toEvent) }; + + if (!isPlacementAllowed(moving, placement, [resource], bookingRules(() => now))) { + // The moving booking's own old time is not a conflict: isPlacementAllowed skips its id. + const other = overlapping.find((b) => b.id !== moving.id); + throw new BookingError( + "conflict", + other + ? `${room.name} is already booked from ${formatOfficeTime(other.startsAt)} to ${formatOfficeTime(other.endsAt)} ("${other.title}").` + : `${room.name} is not free at that time.`, + ); + } +} + +const sqlStateOf = (error: unknown): string | undefined => { + for (let e = error; e && typeof e === "object"; e = (e as { cause?: unknown }).cause) { + if ("sqlState" in e && typeof e.sqlState === "string") return e.sqlState; + } + return undefined; +}; + +/** Turns the database's own refusals into BookingErrors; rethrows anything else. */ +function fromDatabaseError(error: unknown): never { + if (error instanceof BookingError) throw error; + switch (sqlStateOf(error)) { + case "23P01": // exclusion_violation: booking_no_overlap + case "40001": // serialization_failure + case "40P01": // deadlock_detected + throw new BookingError("conflict", "Someone else just booked that time. Pick another slot."); + case "23503": // foreign_key_violation: the room was deleted meanwhile + throw new BookingError("not_found", "That room does not exist."); + case "23514": // check_violation: booking_ends_after_start + throw new BookingError("rule", "The booking must end after it starts."); + } + throw error; +} + +export async function listBookings(db: Db, from: Date, to: Date) { + return db.orm.public.Booking.where((b) => b.startsAt.lt(to)) + .where((b) => b.endsAt.gt(from)) + .orderBy((b) => b.startsAt.asc()) + .all(); +} + +export async function createBooking(db: Db, input: CreateBookingInput, now = new Date()) { + try { + return await db.transaction(async (tx) => { + const rooms = await lockRooms(tx, [input.roomId]); + const draft = { id: "new", title: input.title, startDate: input.startsAt, endDate: input.endsAt }; + await assertPlacementAllowed(tx, rooms.get(input.roomId)!, draft, input, now); + return tx.orm.public.Booking.create({ + roomId: input.roomId, + title: input.title, + booker: input.booker, + startsAt: input.startsAt, + endsAt: input.endsAt, + }); + }); + } catch (error) { + fromDatabaseError(error); + } +} + +/** Moves a booking to another time and/or room; resizing is a move that keeps the room. */ +export async function moveBooking(db: Db, id: string, input: MoveBookingInput, now = new Date()) { + try { + return await db.transaction(async (tx) => { + // Lock the booking first, then the rooms: every writer takes its locks in + // that order, so they queue instead of deadlocking. + const booking = await tx.orm.public.Booking.where({ id }).forNoKeyUpdate().first(); + if (!booking) throw new BookingError("not_found", "That booking no longer exists."); + const rooms = await lockRooms(tx, [booking.roomId, input.roomId]); + await assertPlacementAllowed(tx, rooms.get(input.roomId)!, toEvent(booking), input, now); + const moved = await tx.orm.public.Booking.where({ id }).update({ + roomId: input.roomId, + startsAt: input.startsAt, + endsAt: input.endsAt, + }); + return moved!; + }); + } catch (error) { + fromDatabaseError(error); + } +} + +export async function deleteBooking(db: Db, id: string) { + const deleted = await db.orm.public.Booking.where({ id }).delete(); + if (!deleted) throw new BookingError("not_found", "That booking no longer exists."); + return deleted; +} diff --git a/compute/room-booking-prisma-template/src/server/http.ts b/compute/room-booking-prisma-template/src/server/http.ts new file mode 100644 index 000000000000..3e2588d73bc6 --- /dev/null +++ b/compute/room-booking-prisma-template/src/server/http.ts @@ -0,0 +1,30 @@ +import type { z } from "zod"; + +import type { ApiError, ApiErrorCode } from "../lib/api-types.ts"; +import { fieldErrors } from "../lib/validation.ts"; +import { BookingError } from "./bookings.ts"; + +const STATUS: Record = { invalid: 400, not_found: 404, conflict: 409, rule: 422, internal: 500 }; + +export function errorResponse(code: ApiErrorCode, message: string, fields?: Record) { + const body: ApiError = { error: { code, message, ...(fields && { fields }) } }; + return Response.json(body, { status: STATUS[code] }); +} + +export function invalid(error: z.ZodError) { + const fields = fieldErrors(error); + const first = Object.values(fields).flat()[0] ?? error.issues[0]?.message ?? "The request is not valid."; + return errorResponse("invalid", first, fields); +} + +/** Reads a JSON body; `undefined` when it is missing or not JSON. */ +export async function readJson(request: Request): Promise { + return request.json().catch(() => undefined); +} + +/** A BookingError becomes its status; anything else is logged and becomes a 500. */ +export function fail(error: unknown) { + if (error instanceof BookingError) return errorResponse(error.code, error.message); + console.error(error); + return errorResponse("internal", "Something went wrong. Try again."); +} diff --git a/compute/room-booking-prisma-template/tests/bookings.integration.test.ts b/compute/room-booking-prisma-template/tests/bookings.integration.test.ts new file mode 100644 index 000000000000..0d9cd2feaf9d --- /dev/null +++ b/compute/room-booking-prisma-template/tests/bookings.integration.test.ts @@ -0,0 +1,203 @@ +import { afterAll, beforeEach, describe, expect, it } from "vitest"; +import postgres from "@prisma/orm-postgres/runtime"; + +import type { Contract } from "../src/prisma/contract.d.ts"; +import contractJson from "../src/prisma/contract.json" with { type: "json" }; +import type { Db } from "../src/prisma/db.ts"; +import { seedIfEmpty } from "../src/prisma/seed.ts"; +import { BookingError, createBooking, deleteBooking, moveBooking } from "../src/server/bookings.ts"; + +// These run against a real PostgreSQL (TEST_DATABASE_URL), because they are +// about what two connections do at the same time. Not the local `prisma dev` +// database: that is PGlite, one session shared by every connection. +const url = process.env.TEST_DATABASE_URL; + +// Monday 26 October 2026, 07:00 in Berlin. Bookings below are on Tuesday. +const NOW = new Date("2026-10-26T06:00:00Z"); +const tue = (hhmm: string) => new Date(`2026-10-27T${hhmm}:00+01:00`); + +describe.skipIf(!url)("bookings against PostgreSQL", () => { + const db = postgres({ contractJson, url: url! }) as unknown as Db; + let atlas: string; + let borealis: string; + + const sql = (text: TemplateStringsArray) => + db.transaction(async (tx) => { + await tx.execute(db.raw.sql(text).affectedCount().build()); + }); + const count = async () => (await db.orm.public.Booking.select("id").all()).length; + const book = (roomId: string, start: string, end: string, title = "Meeting") => + createBooking(db, { roomId, title, booker: "Test", startsAt: tue(start), endsAt: tue(end) }, NOW); + + /** Settles every promise and sorts the outcomes: fulfilled, or the BookingError code. */ + const outcomes = async (work: Promise[]) => + (await Promise.allSettled(work)).map((r) => + r.status === "fulfilled" ? "ok" : r.reason instanceof BookingError ? r.reason.code : `unexpected: ${r.reason}`, + ); + + beforeEach(async () => { + await sql`TRUNCATE "Booking", "Room"`; + const rooms = await db.orm.public.Room.createAll([ + { name: "Atlas", floor: "Floor 1", seats: 8 }, + { name: "Borealis", floor: "Floor 1", seats: 4 }, + ]); + [atlas, borealis] = rooms.map((r) => r.id); + }); + + afterAll(async () => { + await db.close(); + }); + + describe("create", () => { + it("books a free slot and refuses an overlapping one with a message", async () => { + await book(atlas, "10:00", "11:00", "Sprint planning"); + await expect(book(atlas, "10:30", "11:30")).rejects.toThrow( + 'Atlas is already booked from 10:00 AM to 11:00 AM ("Sprint planning").', + ); + }); + + it("allows back-to-back bookings, because ends are exclusive", async () => { + await book(atlas, "10:00", "11:00"); + await book(atlas, "11:00", "12:00"); + expect(await count()).toBe(2); + }); + + it("lets two rooms be booked at the same time", async () => { + await book(atlas, "10:00", "11:00"); + await book(borealis, "10:00", "11:00"); + expect(await count()).toBe(2); + }); + + it("refuses times outside the opening hours and in the past", async () => { + await expect(book(atlas, "18:00", "19:00")).rejects.toMatchObject({ code: "rule" }); + await expect( + createBooking(db, { roomId: atlas, title: "x", booker: "y", startsAt: new Date("2026-10-26T05:00:00Z"), endsAt: new Date("2026-10-26T07:00:00Z") }, NOW), + ).rejects.toMatchObject({ code: "rule" }); + }); + + it("refuses an unknown room", async () => { + await expect(book("no-such-room", "10:00", "11:00")).rejects.toMatchObject({ code: "not_found" }); + }); + }); + + describe("move and cancel", () => { + it("moves within the room even where the booking's own old time is", async () => { + const b = await book(atlas, "10:00", "11:00"); + const moved = await moveBooking(db, b.id, { roomId: atlas, startsAt: tue("10:30"), endsAt: tue("11:30") }, NOW); + expect(moved.startsAt).toEqual(tue("10:30")); + }); + + it("moves to another room, and refuses a move onto another booking", async () => { + const a = await book(atlas, "10:00", "11:00"); + await book(borealis, "13:00", "14:00", "Interview"); + await moveBooking(db, a.id, { roomId: borealis, startsAt: tue("10:00"), endsAt: tue("11:00") }, NOW); + await expect( + moveBooking(db, a.id, { roomId: borealis, startsAt: tue("12:30"), endsAt: tue("13:30") }, NOW), + ).rejects.toMatchObject({ code: "conflict" }); + }); + + it("reports a booking that no longer exists", async () => { + const b = await book(atlas, "10:00", "11:00"); + await deleteBooking(db, b.id); + await expect(deleteBooking(db, b.id)).rejects.toMatchObject({ code: "not_found" }); + await expect( + moveBooking(db, b.id, { roomId: atlas, startsAt: tue("12:00"), endsAt: tue("13:00") }, NOW), + ).rejects.toMatchObject({ code: "not_found" }); + }); + }); + + describe("concurrency", () => { + it("lets exactly one of 25 simultaneous bookings of the same slot through", async () => { + const results = await outcomes(Array.from({ length: 25 }, (_, i) => book(atlas, "10:00", "11:00", `Race ${i}`))); + expect(results.filter((r) => r === "ok")).toHaveLength(1); + expect(results.filter((r) => r === "conflict")).toHaveLength(24); + expect(await count()).toBe(1); + }); + + it("lets exactly one of a create and a move into the same slot through", async () => { + const b = await book(borealis, "09:00", "10:00"); + const results = await outcomes([ + book(atlas, "15:00", "16:00"), + moveBooking(db, b.id, { roomId: atlas, startsAt: tue("15:30"), endsAt: tue("16:30") }, NOW), + ]); + expect(results.sort()).toEqual(["conflict", "ok"]); + }); + + it("does not deadlock when bookings move between two rooms in opposite directions", async () => { + const a = await book(atlas, "09:00", "10:00"); + const b = await book(borealis, "09:00", "10:00"); + for (let round = 0; round < 10; round++) { + const [roomA, roomB] = round % 2 === 0 ? [borealis, atlas] : [atlas, borealis]; + const hour = String(10 + round % 7).padStart(2, "0"); + const results = await outcomes([ + moveBooking(db, a.id, { roomId: roomA, startsAt: tue(`${hour}:00`), endsAt: tue(`${hour}:30`) }, NOW), + moveBooking(db, b.id, { roomId: roomB, startsAt: tue(`${hour}:30`), endsAt: tue(`${String(Number(hour) + 1).padStart(2, "0")}:00`) }, NOW), + ]); + expect(results).toEqual(["ok", "ok"]); + } + }); + + describe("without the exclusion constraint", () => { + const dropConstraint = () => sql`ALTER TABLE "Booking" DROP CONSTRAINT IF EXISTS "booking_no_overlap"`; + const restoreConstraint = () => + sql`ALTER TABLE "Booking" ADD CONSTRAINT "booking_no_overlap" EXCLUDE USING gist ("roomId" WITH =, tstzrange("startsAt", "endsAt", '[)') WITH &&)`; + + it("still lets exactly one of 25 through: the room lock alone is enough", async () => { + await dropConstraint(); + try { + const results = await outcomes(Array.from({ length: 25 }, () => book(atlas, "10:00", "11:00"))); + expect(results.filter((r) => r === "ok")).toHaveLength(1); + expect(await count()).toBe(1); + } finally { + await restoreConstraint(); + } + }); + + it("shows why the lock exists: a plain check-then-insert double-books", async () => { + // Two transactions both read "free", then both insert. This is the + // interleaving the lock in createBooking makes impossible. + let arrived = 0; + let release!: () => void; + const bothHaveRead = new Promise((resolve) => (release = resolve)); + const naive = (title: string) => + db.transaction(async (tx) => { + const clash = await tx.orm.public.Booking.where({ roomId: atlas }) + .where((b) => b.startsAt.lt(tue("11:00"))) + .where((b) => b.endsAt.gt(tue("10:00"))) + .first(); + if (++arrived === 2) release(); + await bothHaveRead; + if (clash) throw new Error("taken"); + await tx.orm.public.Booking.create({ roomId: atlas, title, booker: "Naive", startsAt: tue("10:00"), endsAt: tue("11:00") }); + }); + + await dropConstraint(); + try { + await Promise.all([naive("First"), naive("Second")]); + expect(await count()).toBe(2); // double booked + } finally { + await sql`TRUNCATE "Booking"`; + await restoreConstraint(); + } + }); + }); + + it("has Postgres refuse an overlap that skips the app's check (the exclusion constraint)", async () => { + await book(atlas, "10:00", "11:00"); + const error = await db.orm.public.Booking.create({ roomId: atlas, title: "Sneaky", booker: "SQL", startsAt: tue("10:30"), endsAt: tue("11:30") }).catch((e: unknown) => e); + const sqlState = (e: unknown): unknown => (e && typeof e === "object" ? ("sqlState" in e ? e.sqlState : sqlState((e as { cause?: unknown }).cause)) : undefined); + expect(sqlState(error)).toBe("23P01"); // exclusion_violation + expect(await count()).toBe(1); + }); + }); + + describe("seed", () => { + it("inserts the demo data once, even when called five times at once", async () => { + await sql`TRUNCATE "Booking", "Room"`; + const inserted = await Promise.all(Array.from({ length: 5 }, () => seedIfEmpty(db, NOW))); + expect(inserted.filter(Boolean)).toHaveLength(1); + expect(await db.orm.public.Room.select("id").all()).toHaveLength(6); + expect(await count()).toBe(15); + }); + }); +}); diff --git a/compute/room-booking-prisma-template/tests/global-setup.ts b/compute/room-booking-prisma-template/tests/global-setup.ts new file mode 100644 index 000000000000..38551b603cd1 --- /dev/null +++ b/compute/room-booking-prisma-template/tests/global-setup.ts @@ -0,0 +1,16 @@ +import { execSync } from "node:child_process"; + +// Brings TEST_DATABASE_URL up to date with the committed migrations, the same +// way a deploy does. Without TEST_DATABASE_URL the integration tests skip. +export default function setup() { + const url = process.env.TEST_DATABASE_URL; + if (!url) { + console.warn("\nTEST_DATABASE_URL is not set: skipping the PostgreSQL integration tests. See the README.\n"); + return; + } + // Through the shell, so Windows finds npx.cmd. + execSync("npx prisma db migrate --yes", { + env: { ...process.env, DATABASE_URL: url }, + stdio: "pipe", + }); +} diff --git a/compute/room-booking-prisma-template/tests/rules.test.ts b/compute/room-booking-prisma-template/tests/rules.test.ts new file mode 100644 index 000000000000..bcd778ba05e8 --- /dev/null +++ b/compute/room-booking-prisma-template/tests/rules.test.ts @@ -0,0 +1,88 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { isPlacementAllowed } from "resource-scheduler/headless"; +import type { Resource } from "resource-scheduler/headless"; + +import { bookingRules, checkBookingRules, isWithinOpeningHours, startOfCurrentSlot } from "../src/lib/rules.ts"; + +// The office is in Europe/Berlin: UTC+1 on 27 October 2026, UTC+2 in July. +const at = (iso: string) => new Date(iso); +const NOW = at("2026-10-27T06:00:00Z"); // 07:00 in Berlin, before opening + +describe("isWithinOpeningHours (08:00 to 18:00 office time)", () => { + it("accepts a booking from opening to closing", () => { + expect(isWithinOpeningHours(at("2026-10-27T07:00:00Z"), at("2026-10-27T17:00:00Z"))).toBe(true); + }); + + it("refuses a start before 08:00", () => { + expect(isWithinOpeningHours(at("2026-10-27T06:30:00Z"), at("2026-10-27T07:30:00Z"))).toBe(false); + }); + + it("refuses an end after 18:00", () => { + expect(isWithinOpeningHours(at("2026-10-27T16:30:00Z"), at("2026-10-27T17:30:00Z"))).toBe(false); + }); + + it("refuses a booking that runs into the next day", () => { + expect(isWithinOpeningHours(at("2026-10-27T16:00:00Z"), at("2026-10-28T08:00:00Z"))).toBe(false); + }); + + it("follows the office's summer time", () => { + // 08:00 in Berlin is 06:00 UTC in July and 07:00 UTC in late October. + expect(isWithinOpeningHours(at("2026-07-14T06:00:00Z"), at("2026-07-14T07:00:00Z"))).toBe(true); + expect(isWithinOpeningHours(at("2026-10-27T06:00:00Z"), at("2026-10-27T07:00:00Z"))).toBe(false); + }); + + describe("does not depend on the machine's own time zone", () => { + const original = process.env.TZ; + afterEach(() => { + process.env.TZ = original; + }); + + it.each(["UTC", "America/Los_Angeles", "Asia/Kolkata", "Pacific/Auckland"])("TZ=%s", (zone) => { + process.env.TZ = zone; + expect(isWithinOpeningHours(at("2026-10-27T07:00:00Z"), at("2026-10-27T08:00:00Z"))).toBe(true); + expect(isWithinOpeningHours(at("2026-10-27T17:00:00Z"), at("2026-10-27T18:00:00Z"))).toBe(false); + }); + }); +}); + +describe("checkBookingRules", () => { + it("allows the current half hour, not the one before", () => { + const now = at("2026-10-27T09:47:00Z"); // 10:47 in Berlin + expect(startOfCurrentSlot(now)).toEqual(at("2026-10-27T09:30:00Z")); + expect(checkBookingRules({ start: at("2026-10-27T09:30:00Z"), end: at("2026-10-27T10:00:00Z") }, now)).toBeNull(); + expect(checkBookingRules({ start: at("2026-10-27T09:00:00Z"), end: at("2026-10-27T10:00:00Z") }, now)).toBe( + "in-the-past", + ); + }); + + it("reports opening hours before the past", () => { + expect(checkBookingRules({ start: at("2026-10-27T18:00:00Z"), end: at("2026-10-27T19:00:00Z") }, NOW)).toBe( + "outside-opening-hours", + ); + }); +}); + +describe("bookingRules with isPlacementAllowed (what the browser and the server both run)", () => { + const rules = bookingRules(() => NOW); + const standup = { id: "standup", title: "Standup", startDate: at("2026-10-27T08:00:00Z"), endDate: at("2026-10-27T08:30:00Z") }; + const atlas: Resource = { id: "atlas", name: "Atlas", events: [standup] }; + const draft = (start: string, end: string) => ({ id: "new", title: "", startDate: at(start), endDate: at(end) }); + const allowed = (event: ReturnType, start: string, end: string) => + isPlacementAllowed(event, { resourceId: "atlas", start: at(start), end: at(end) }, [atlas], rules); + + it("refuses an overlap", () => { + expect(allowed(draft("2026-10-27T08:15:00Z", "2026-10-27T09:00:00Z"), "2026-10-27T08:15:00Z", "2026-10-27T09:00:00Z")).toBe(false); + }); + + it("allows a booking that starts when another ends (ends are exclusive)", () => { + expect(allowed(draft("2026-10-27T08:30:00Z", "2026-10-27T09:00:00Z"), "2026-10-27T08:30:00Z", "2026-10-27T09:00:00Z")).toBe(true); + }); + + it("does not count a booking's own old time as a conflict when it moves", () => { + expect(allowed(standup, "2026-10-27T08:15:00Z", "2026-10-27T08:45:00Z")).toBe(true); + }); + + it("applies the rules through isValidDrop", () => { + expect(allowed(draft("2026-10-27T17:00:00Z", "2026-10-27T17:30:00Z"), "2026-10-27T17:00:00Z", "2026-10-27T17:30:00Z")).toBe(false); + }); +}); diff --git a/compute/room-booking-prisma-template/tests/validation.test.ts b/compute/room-booking-prisma-template/tests/validation.test.ts new file mode 100644 index 000000000000..8887560fbf8a --- /dev/null +++ b/compute/room-booking-prisma-template/tests/validation.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; + +import { createBookingSchema, fieldErrors, moveBookingSchema, rangeSchema } from "../src/lib/validation.ts"; + +const valid = { + roomId: "room_1", + title: " Sprint planning ", + booker: "Priya", + startsAt: "2026-10-27T09:00:00.000Z", + endsAt: "2026-10-27T11:00:00+01:00", +}; + +describe("createBookingSchema", () => { + it("parses dates with any offset into instants, and trims text", () => { + const parsed = createBookingSchema.parse(valid); + expect(parsed.title).toBe("Sprint planning"); + expect(parsed.startsAt).toEqual(new Date("2026-10-27T09:00:00Z")); + expect(parsed.endsAt).toEqual(new Date("2026-10-27T10:00:00Z")); + }); + + it("explains every bad field", () => { + const result = createBookingSchema.safeParse({ roomId: "", title: " ", startsAt: "tomorrow", endsAt: valid.endsAt }); + expect(result.success).toBe(false); + expect(fieldErrors(result.error!)).toEqual({ + roomId: ["Pick a room."], + title: ["Give the booking a title."], + booker: ["Say who the booking is for."], + startsAt: ["Use an ISO 8601 date and time with a time zone."], + }); + }); + + it("needs a time zone on every date, so the server never guesses", () => { + expect(createBookingSchema.safeParse({ ...valid, startsAt: "2026-10-27T09:00:00" }).success).toBe(false); + }); + + it("reports one bad date as a field error instead of throwing (regression: was a 500)", () => { + const result = createBookingSchema.safeParse({ ...valid, startsAt: "tomorrow" }); + expect(fieldErrors(result.error!)).toEqual({ startsAt: ["Use an ISO 8601 date and time with a time zone."] }); + }); + + it("refuses an end that is not after the start", () => { + const result = createBookingSchema.safeParse({ ...valid, endsAt: valid.startsAt }); + expect(fieldErrors(result.error!).endsAt).toEqual(["The booking must end after it starts."]); + }); + + it("refuses a booking longer than 12 hours", () => { + const result = createBookingSchema.safeParse({ ...valid, endsAt: "2026-10-27T21:30:00Z" }); + expect(fieldErrors(result.error!).endsAt).toEqual(["A booking can last at most 12 hours."]); + }); + + it("caps the length of text", () => { + const result = createBookingSchema.safeParse({ ...valid, title: "x".repeat(81) }); + expect(fieldErrors(result.error!).title).toEqual(["Keep the title under 80 characters."]); + }); +}); + +describe("moveBookingSchema", () => { + it("needs only the room and the times", () => { + expect(moveBookingSchema.safeParse({ roomId: "room_1", startsAt: valid.startsAt, endsAt: "2026-10-27T09:30:00Z" }).success).toBe(true); + }); +}); + +describe("rangeSchema", () => { + it("reports one bad date as a field error instead of throwing", () => { + const result = rangeSchema.safeParse({ from: "bad", to: "2026-10-27T00:00:00Z" }); + expect(Object.keys(fieldErrors(result.error!))).toEqual(["from"]); + }); + + it("refuses a backwards or very long range", () => { + expect(rangeSchema.safeParse({ from: "2026-10-28T00:00:00Z", to: "2026-10-27T00:00:00Z" }).success).toBe(false); + expect(rangeSchema.safeParse({ from: "2026-01-01T00:00:00Z", to: "2026-06-01T00:00:00Z" }).success).toBe(false); + }); +}); diff --git a/compute/room-booking-prisma-template/tsconfig.json b/compute/room-booking-prisma-template/tsconfig.json new file mode 100644 index 000000000000..6dfc5f3095cc --- /dev/null +++ b/compute/room-booking-prisma-template/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "preserve", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "types": [ + "node" + ], + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": [ + "node_modules" + ] +} diff --git a/compute/room-booking-prisma-template/vitest.config.ts b/compute/room-booking-prisma-template/vitest.config.ts new file mode 100644 index 000000000000..03b6f4d30a5e --- /dev/null +++ b/compute/room-booking-prisma-template/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["tests/**/*.test.ts"], + // Applies the migrations to TEST_DATABASE_URL before the integration tests. + globalSetup: ["tests/global-setup.ts"], + // The integration tests share one database; run files one after another. + fileParallelism: false, + testTimeout: 30_000, + }, +}); diff --git a/compute/templates.json b/compute/templates.json index ed26787163b5..7c434bbf4e1d 100644 --- a/compute/templates.json +++ b/compute/templates.json @@ -28,6 +28,14 @@ "description": "Simple personal website built with Astro and deployed to Prisma Compute.", "path": "compute/personal-site", "framework": "astro" + }, + { + "id": "room-booking-prisma-template", + "name": "Room Booking", + "description": "Next.js meeting room booking on a Resource Scheduler timeline that never double-books, with Prisma ORM and Prisma Postgres, deployed to Prisma Compute.", + "path": "compute/room-booking-prisma-template", + "framework": "nextjs", + "author": "Mohammed Obaid" } ] } From 551397552344c85a03b51157803d6149b415ca85 Mon Sep 17 00:00:00 2001 From: Mohammed Obaid Date: Wed, 28 Oct 2026 14:30:12 +0530 Subject: [PATCH 2/2] fix(compute): address review of room-booking-prisma-template - prisma.config.ts: rethrow loadEnvFile errors other than ENOENT - README: create the rooms database in the Docker command - board: refresh after network failures too, not only conflicts - booking dialog: editing a field clears its server error --- compute/room-booking-prisma-template/README.md | 2 +- .../room-booking-prisma-template/prisma.config.ts | 3 ++- .../room-booking-prisma-template/src/app/board.tsx | 7 +++++-- .../src/app/booking-dialog.tsx | 13 ++++++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/compute/room-booking-prisma-template/README.md b/compute/room-booking-prisma-template/README.md index 9c4cf6245bc9..8513fecd6297 100644 --- a/compute/room-booking-prisma-template/README.md +++ b/compute/room-booking-prisma-template/README.md @@ -71,7 +71,7 @@ npm run dev # http://localhost:3000, seeds demo data on first No database at hand? `npx create-db@latest` creates a temporary Prisma Postgres database and prints its connection string. Or run PostgreSQL in Docker: ```bash -docker run -d --name rooms-db -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:17 +docker run -d --name rooms-db -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=rooms postgres:17 ``` Use `.env.local`, not `.env`: `next build` copies `.env` into the bundle that a deploy uploads. diff --git a/compute/room-booking-prisma-template/prisma.config.ts b/compute/room-booking-prisma-template/prisma.config.ts index 8337342983ab..16f36c573d85 100644 --- a/compute/room-booking-prisma-template/prisma.config.ts +++ b/compute/room-booking-prisma-template/prisma.config.ts @@ -11,8 +11,9 @@ import { prismaCloud, prismaState } from "@prisma/composer-prisma-cloud/control" // that `prisma deploy` uploads, and a local database URL has no business there. try { process.loadEnvFile(".env.local"); -} catch { +} catch (error) { // no .env.local: use the environment as it is (CI, Composer deploys) + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } export default definePrismaConfig({ diff --git a/compute/room-booking-prisma-template/src/app/board.tsx b/compute/room-booking-prisma-template/src/app/board.tsx index 73d1e3a2e2df..7d55d3609119 100644 --- a/compute/room-booking-prisma-template/src/app/board.tsx +++ b/compute/room-booking-prisma-template/src/app/board.tsx @@ -43,6 +43,8 @@ const messageOf = (error: unknown) => const isGone = (error: unknown) => error instanceof ApiRequestError && error.code === "not_found"; const isConflict = (error: unknown) => error instanceof ApiRequestError && error.code === "conflict"; +/** A conflict, or a failure that may have reached the server: show what is saved now. */ +const shouldRefresh = (error: unknown) => isConflict(error) || !(error instanceof ApiRequestError); /** * The calendar. Every change is optimistic: it shows at once, is sent to the @@ -133,7 +135,7 @@ export function Board({ } catch (error) { setBookings((all) => all.filter((b) => b.id !== tempId)); // roll back setNotice({ kind: "error", text: messageOf(error) }); - if (isConflict(error)) void refresh(); // show what is in the way + if (shouldRefresh(error)) void refresh(); // show what is in the way, or what was saved if (error instanceof ApiRequestError && error.code === "invalid") { setDraft({ ...slot, values: details, errors: error.fields }); // reopen the form with the server's messages } @@ -155,7 +157,7 @@ export function Board({ isGone(error) ? all.filter((b) => b.id !== id) : all.map((b) => (b.id === id ? before : b)), // roll back ); setNotice({ kind: "error", text: messageOf(error) }); - if (isConflict(error)) void refresh(); // show what is in the way + if (shouldRefresh(error)) void refresh(); // show what is in the way, or what was saved } } @@ -175,6 +177,7 @@ export function Board({ } setBookings((all) => [...all, before]); // roll back setNotice({ kind: "error", text: messageOf(error) }); + if (shouldRefresh(error)) void refresh(); } } diff --git a/compute/room-booking-prisma-template/src/app/booking-dialog.tsx b/compute/room-booking-prisma-template/src/app/booking-dialog.tsx index 402963290e6d..2e7bf60ba2d7 100644 --- a/compute/room-booking-prisma-template/src/app/booking-dialog.tsx +++ b/compute/room-booking-prisma-template/src/app/booking-dialog.tsx @@ -53,6 +53,17 @@ export function BookingDialog({ const [errors, setErrors] = useState>(draft.errors ?? {}); const [booker] = useState(() => draft.values?.booker ?? rememberedBooker()); + // Editing a field clears the server message about it. + function clearError(event: { target: EventTarget }) { + const { name } = event.target as HTMLInputElement; + if (!errors[name]) return; + setErrors((all) => { + const rest = { ...all }; + delete rest[name]; + return rest; + }); + } + useEffect(() => { dialog.current?.showModal(); }, []); @@ -75,7 +86,7 @@ export function BookingDialog({ return ( -
+

Book {draft.roomName}

{formatOfficeDay(draft.start)}, {formatOfficeTime(draft.start)} to {formatOfficeTime(draft.end)}